পাইথন তালিকার টুকরো সহ অ্যাসাইনমেন্ট কীভাবে কাজ করে?


102

পাইথন ডক বলেছেন যে তালিকার টুকরো টুকরো করা একটি নতুন তালিকা দেয়।
এখন যদি কোনও "নতুন" তালিকা ফিরে আসে তবে আমি "স্লাইসগুলিকে অ্যাসাইনমেন্ট" সম্পর্কিত নিম্নলিখিত প্রশ্নগুলি করেছি

a = [1, 2, 3]
a[0:2] = [4, 5]
print a

এখন আউটপুট হবে:

[4, 5, 3] 
  1. যে কোনও কিছু ফিরে আসছে তা কীভাবে ভাবের বাম দিকে আসতে পারে?
  2. হ্যাঁ, আমি ডকগুলি পড়েছি এবং এটি বলেছে এটি সম্ভব, এখন যেহেতু একটি তালিকা বিচ্ছিন্নকরণ "নতুন" তালিকার প্রত্যাবর্তন করে, কেন আসল তালিকাটি সংশোধন করা হচ্ছে? এর পেছনের যান্ত্রিকতা আমি বুঝতে পারছি না।

@ মারক লংগায়ার দুঃখিত, আমি ভেবেছিলাম যে কেবল কোডটিই আউটপুট না করেই ফরম্যাট করা উচিত
কার্তিক আনন্দ


7
তুমি কি বুঝবে কি a[0] = 4করবে?
জোশ লি

4
@ কার্তিকআনন্দ স্লাইস অ্যাসাইনমেন্ট একটি বিশেষ দৃশ্য যেখানে একটি নতুন তালিকা তৈরি হয় না। এর বাম পাশে নাম বাঁধা ছাড়া কোনও অবজেক্ট তৈরি করা কোনও অর্থবোধ করে না =, সুতরাং এটিকে অবৈধ বাক্য বিন্যাস হিসাবে বাদ দেওয়ার পরিবর্তে পাইথন এটি প্রত্যাশার মতো আরও কিছুতে পরিণত করে। যেহেতু অজগরটির রেফারেন্স নেই, তাই কোনও টুকরো ফলাফলের ফলে মূল তালিকা পরিবর্তন করা কার্যকর হবে না। আপনি একটি অনুলিপি পেতে। আপনি যদি আপনার অ্যাপ্লিকেশনটিতে আরও তথ্য সরবরাহ করেন তবে আমরা 'পাইথোনিক' উপায়ে জিনিসগুলি করতে আরও ভালভাবে সহায়তা করতে পারি। :)
কেসি কুবাল

4
@ ডার্থফেট আমি এখনই কোনও অ্যাপ্লিকেশন নিয়ে কাজ করছি না বরং নিজের হাত নোংরা হওয়া শুরু করার আগে আমি নিজেকে অজগর শেখাচ্ছি :)
কার্তিক আনন্দ

উত্তর:


117

আপনি দুটি স্বতন্ত্র অপারেশনকে বিভ্রান্ত করছেন যা খুব অনুরূপ সিনট্যাক্স ব্যবহার করে:

1) কাটা:

b = a[0:2]

এটি এর স্লাইসের একটি অনুলিপি তৈরি করে aএবং এটি নির্ধারণ করে b

2) স্লাইস অ্যাসাইনমেন্ট:

a[0:2] = b

এই বিষয়বস্তু সঙ্গে স্লাইস প্রতিস্থাপনab

যদিও সিনট্যাক্সটি একই রকম (আমি ডিজাইনের মাধ্যমে কল্পনা করি!), এটি দুটি পৃথক ক্রিয়াকলাপ।


4
আমার সন্দেহটি এটাই, দ্বিতীয় ক্ষেত্রে, ক এর টুকরোটি কেন নয়, একটি নতুন তালিকা ??
কার্তিক আনন্দ

12
পছন্দ করেছেন ভাষাটি যা নির্দিষ্ট করে তা নয়।
মার্সিন

স্পষ্টভাবে বলতে গেলে, "" এর একটি টুকরো নেয় "এর অর্থ" বিভ্রান্তির অংশটি আসে "এর অর্থ" "একটি স্লাইসের একটি অনুলিপি তৈরি করুন"।
মার্ক রান্সম

4
@ কার্তিকানন্দ: মূলত, হ্যাঁ দোভাষী যিনি কোনটি জানেন এবং যথাযথভাবে পরিচালনা করেন।
এনপিই

4
@ ডাবস্লো: আপনি এটিরটুলস মডিউলটি ব্যবহার করে তা করতে পারেন । আপনার ক্ষেত্রে ফাংশন islice , সহ start=1, ব্যবহার করুন stop=None। এটি কোনও অনুলিপি এড়াতে এবং অলস মূল্যায়ন ব্যবহার করবে (আপনার ক্ষেত্রে অলস অ্যাক্সেসটি আসল তালিকার ক্ষেত্রে)।
স্পিরোস

69

আপনি যখন অপারেটরের aবাম দিকে সুনির্দিষ্ট করেন =, আপনি পাইথনের স্বাভাবিক অ্যাসাইনমেন্টটি ব্যবহার করছেন , যা aবর্তমান প্রসঙ্গে নামটি নতুন মানকে নির্দেশ করে। এটি পূর্ববর্তী মানটি যা aনির্দেশ করছিল তা পরিবর্তন করে না ।

অপারেটরের a[0:2]বাম দিকে নির্দিষ্ট করে =আপনি পাইথনকে বলছেন যে আপনি স্লাইস অ্যাসাইনমেন্টটি ব্যবহার করতে চান । স্লাইস অ্যাসাইনমেন্ট হল তালিকার জন্য একটি বিশেষ বাক্য গঠন, যেখানে আপনি তালিকা থেকে সামগ্রীগুলি সন্নিবেশ করতে, মুছতে বা প্রতিস্থাপন করতে পারেন:

সন্নিবেশ :

>>> a = [1, 2, 3]
>>> a[0:0] = [-3, -2, -1, 0]
>>> a
[-3, -2, -1, 0, 1, 2, 3]

মোছা :

>>> a
[-3, -2, -1, 0, 1, 2, 3]
>>> a[2:4] = []
>>> a
[-3, -2, 1, 2, 3]

প্রতিস্থাপন :

>>> a
[-3, -2, 1, 2, 3]
>>> a[:] = [1, 2, 3]
>>> a
[1, 2, 3]

বিঃদ্রঃ:

স্লাইসের দৈর্ঘ্য নির্ধারিত সিকোয়েন্সের দৈর্ঘ্যের চেয়ে আলাদা হতে পারে, সুতরাং লক্ষ্য সিকোয়েন্সটি যদি এটির অনুমতি দেয় তবে লক্ষ্য সিকোয়েন্সের দৈর্ঘ্য পরিবর্তন করে। - উত্স

স্লাইস অ্যাসাইনমেন্ট টিপল আনপ্যাকিংয়ের অনুরূপ ফাংশন সরবরাহ করে । উদাহরণস্বরূপ, a[0:1] = [4, 5]এর সমতুল্য:

# Tuple Unpacking
a[0], a[1] = [4, 5]

টিপল আনপ্যাকিংয়ের সাহায্যে আপনি অ-অনুক্রমিক তালিকাগুলি সংশোধন করতে পারেন:

>>> a
[4, 5, 3]
>>> a[-1], a[0] = [7, 3]
>>> a
[3, 5, 7]

তবে, টিপল আনপ্যাকিং প্রতিস্থাপনের মধ্যে সীমাবদ্ধ, কারণ আপনি উপাদানগুলি সন্নিবেশ করতে বা সরাতে পারবেন না।

এই সমস্ত অপারেশনের আগে এবং পরে, aএকই সঠিক তালিকা। পাইথন সহজেই স্থানটিতে একটি তালিকা সংশোধন করার জন্য দুর্দান্ত সিনট্যাকটিক চিনি সরবরাহ করে।


6
অনুরূপ তবে অভিন্ন নয়, যেহেতু আপনার বাম এবং ডানদিকে অসম সংখ্যা রয়েছে।
মার্ক র্যানসম

@ মার্করানসম এটি একটি দুর্দান্ত বিষয়, এটি সুস্পষ্ট করার জন্য আমি আরও তথ্য যুক্ত করেছি।
কেসি কুবল

4
এর a[:] = some_listসমতুল্য a = some_list[:]নাকি a = some_list?
jadkik94

4
@ jadkik94 না। a[:] = some_listপ্রতিটি উপাদানকে aসেগুলির জন্য সেট করে some_list। আপনি যেগুলির উল্লেখ করেছেন সেগুলির মধ্যে দুটি একটি করে করলে যা পরিবর্তন হয় তা ঘটে a। উদাহরণস্বরূপ: a = [1, 2, 3] b = a a[:] = [4, 5, 6] a is b। শেষ লাইনটি মিথ্যা হবে যদি তা পরিবর্তনের aপরিবর্তে এর মান পরিবর্তন হয়।
কেসি কুবল

@ ক্যাসিকুবাল start: stop: stepযখন আমরা স্লাইস অ্যাসাইনমেন্টটি করি তখন এর মান কি সর্বদা ইতিবাচক হওয়া উচিত?
ধর্মঘট 15

26

আমি একই প্রশ্নটি আগে এসেছিলাম এবং এটি ভাষা নির্দিষ্টকরণের সাথে সম্পর্কিত। অ্যাসাইনমেন্ট-বিবৃতি অনুসারে ,

  1. যদি অ্যাসাইনমেন্টের বাম দিকের সাবস্ক্রিপশন হয়, পাইথন __setitem__object বস্তুটিতে কল করবে । a[i] = xসমতূল্য a.__setitem__(i, x)

  2. যদি অ্যাসাইনমেন্টের বাম দিকটি স্লাইস হয় তবে পাইথনও কল করবে __setitem__, তবে বিভিন্ন যুক্তি সহ: a[1:4]=[1,2,3]সমান a.__setitem__(slice(1,4,None), [1,2,3])

'=' এর বাম দিকে তালিকা স্লাইস আলাদা আচরণ করে।


4

কোনও অ্যাসাইনমেন্ট অপারেশনের বাম দিকে স্লাইস করে আপনি কোন আইটেমটি অর্পণ করবেন তা নির্দিষ্ট করে দিচ্ছেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.