আমি কীভাবে একটি লুপের জন্য অব্যবহৃত ভেরিয়েবল ঘোষণা করতে পারি?


88

আমার মতো যদি একটি তালিকা বোঝাপড়া থাকে (উদাহরণস্বরূপ):

['' for x in myList]

কার্যকরভাবে একটি নতুন তালিকা তৈরি করা যাতে তালিকার প্রতিটি উপাদানগুলির জন্য খালি স্ট্রিং থাকে, আমি কখনই এটি ব্যবহার করি না x। এটি লেখার কোনও পরিষ্কার উপায় আছে যাতে আমাকে অব্যবহৃত xভেরিয়েবলটি ঘোষণা করতে হবে না ?


এই প্রশ্নের দ্বারা অনুপ্রাণিত হয়ে, আমি তালিকা বোধের
ব্রেন্ডন মেটক্যাল্ফ

উত্তর:


132

_ লুপ এবং টিপল অ্যাসাইনমেন্টে উপেক্ষা করা সদস্যদের জন্য একটি আদর্শ স্থানধারকের নাম, যেমন eg

['' for _ in myList]

[a+d for a, _, _, d, _ in fiveTuples]

বিটিডাব্লু আপনার তালিকাটি তালিকা বোঝাপড়া ছাড়াই লিখিত হতে পারে (ধরে নিলে আপনি স্ট্রিং, ইন্টিজার ইত্যাদির মতো অপরিবর্তনীয় সদস্যদের একটি তালিকা তৈরি করতে চান)।

[''] * len(myList)

10
পরেরটি অবশ্যই একটি বিশাল সতর্কতার সাথে থাকতে হবে যা এটি পরিবর্তনীয় বস্তুর জন্য প্রত্যাশিত কাজটি করে না।

4
@ মোহিত:a=[[]]*4;a[0].append(5);print(a)
কেনেটিএম

@ র‌্যামি: মোহিত একটি ব্যাখ্যা পোস্ট করেছেন তবে এটি মুছে ফেলা হয়েছে: এস যাইহোক, ডকস.প্যাথন.আর.পিপথন.আর
কেনেটিএম

4
@ র‌্যামি, পাইথন স্মৃতিতে একই বস্তুর জন্য একই রেফারেন্স বজায় রাখে।
মোহিত রঙ্ক 9

forউদাহরণস্বরূপ, আমি নেস্টেড লুপগুলি করছি কিনা তা বিবেচনা করে ? নাকি ভিতরে for _ in range(...)বলতে চাই _, var = f(x)? এটি কি দুটি _ভেরিয়েবলের মধ্যে বিভ্রান্ত হবে ?
এরিক আউল্ড

19

জেন যেমনটি লিখেছেন: বিধিগুলি ভঙ্গ করার জন্য বিশেষ কেসগুলি বিশেষ বিশেষ নয়। বিশেষ জিনিসটি আইটেমগুলি পুনরাবৃত্তি হওয়া এবং আইটেমগুলি পুনরাবৃত্তি না করে লুপ করা হচ্ছে এবং আনপ্যাক করার জন্য একটি "টার্গেট" রয়েছে এমন নিয়ম।

তবে আপনি _পরিবর্তনশীল নাম হিসাবে ব্যবহার করতে পারেন, যা সাধারণত "ইচ্ছাকৃতভাবে অব্যবহৃত" হিসাবে বোঝা যায় (এমনকি পাইলিন্ট ইত্যাদি এটি জানে এবং সম্মান করে)।


PyLint তবে অভিযোগ যে C: 10,24: Invalid variable name "_" (invalid-name), যদি না আপনি এটি যোগ good-namesআপনার .pylintrc
জিওরজিওসিরোনি

13

এটা পরিনত হয় যে ব্যবহার dummy*(শব্দ শুরু ডামি হয়) পরিবর্তনশীল নামের মতই কৌতুক আছে __এটি একটি পরিচিত মান এবং এটি অর্থবহ পরিবর্তনশীল নাম ব্যবহার করা ভাল। আপনি ব্যবহার করতে পারেন তাই dummy, dummy1, dummy_anything। এই পরিবর্তনশীল নামগুলি ব্যবহার করে PyLintঅভিযোগ করবেন না।


আমি সত্যিই এই পদ্ধতির পছন্দ। এটি অর্থবহ থেকে যায়।
আরভিডিকে

2

একই লাইনে লুপের পরে নিম্নলিখিত মন্তব্য যুক্ত করুন:

# পাইলেট: অক্ষম = অব্যবহৃত-পরিবর্তনশীল

for i in range(100): #pylint: disable=unused-variable

1

যদি আপনার নিজের যুক্তিগুলির নাম দেওয়ার প্রয়োজন হয় (উদাহরণস্বরূপ, মক রচনা করার সময় যা নাম দ্বারা রেফারেন্সযুক্ত নির্দিষ্ট যুক্তি ব্যবহার করে না), আপনি এই শর্টকাট পদ্ধতিটি যুক্ত করতে পারেন:

def UnusedArgument(_):
  pass

এবং তারপরে এটি ব্যবহার করুন

def SomeMethod(name_should_remain):
  UnusedArgument(name_should_remain)

0

জেনারেটর অবজেক্টস আসলে ভেরিয়েবল ব্যবহার করে না। তাই কিছু

list(('' for x in myList))

কৌতুক করা উচিত। নোট করুন যে এক্স জেনারেটর বোঝার বাইরে চলক হিসাবে সংজ্ঞায়িত করা হয় না।


0

আপনি _যদি ভেরিয়েবলটিকে মানব পাঠযোগ্য নাম দেওয়া পছন্দ করেন তবে আপনি এর সাথে একটি ভেরিয়েবলের নামও প্রিন্ড করতে পারেন । উদাহরণস্বরূপ, আপনি ব্যবহার করতে পারেন _foo, _foo1, _anythingএবং PyLint অভিযোগ করা হবে না। লুপের জন্য এটির মতো হবে:

for _something in range(10):
    do_something_else()

সম্পাদনা করুন: উদাহরণ যোগ করুন


0

একটি ভার্বোজ উপায়:

newList = []
while len(newList) < len(mylist):
    newList.append('')

আপনি এইভাবে ব্যবহৃত ভেরিয়েবল ঘোষণা করা এড়াতে পারেন।

এছাড়াও আপনি উভয় পরিবর্তনীয় এবং অপরিবর্তনীয় বস্তুগুলিকে (অভিধানের মতো) যুক্ত করতে পারেন newList

আমার মতো অজগর নতুনদের জন্য আরেকটি জিনিস, '_', 'ডামি' কিছুটা হতাশাব্যঞ্জক।



-1

মন্তব্যে আমি কীভাবে একটি লুপের জন্য অব্যবহৃত ভেরিয়েবল ঘোষণা করতে পারি? (মন্তব্য আকারের বাইরে)

পাইথন তৈরি বস্তুর জন্য একই রেফারেন্স বজায় রাখে। (নির্বিশেষে নির্বিশেষে), উদাহরণস্বরূপ,

In [1]: i = 1

In [2]: j = 1

In [3]: id(i)
Out[3]: 142671248

In [4]: id(j)
Out[4]: 142671248

আপনি, আমি এবং জে উভয়ই দেখতে পাচ্ছেন, মেমরিতে একই বস্তুর উল্লেখ করুন happens যখন আমরা একটি অচল পরিবর্তনশীলটির মান পরিবর্তন করি তখন কী হয়।

In [5]: j = j+1

In [6]: id(i)
Out[6]: 142671248

In [7]: id(j)
Out[7]: 142671236

আপনি দেখতে পাচ্ছেন যে জে এখন একটি নতুন অবস্থান নির্দেশ করতে শুরু করে (যেখানে ২ টি সঞ্চিত রয়েছে) এবং আমি এখনও সেই অবস্থানটির দিকে নির্দেশ করি যেখানে 1 টি সঞ্চিত রয়েছে। মূল্যায়ন করার সময়,

j = j+1

মানটি 142671248 থেকে গণনা করা হয়েছে, গণনা করা হয়েছে (যদি ইতিমধ্যে ক্যাশে না করা হয়), এবং একটি নতুন স্থানে 142671236 স্থাপন করা হয়। জে নতুন অবস্থানে দেখানোর জন্য তৈরি করা হয়েছে। সরল পদে প্রতিবার একটি নতুন অনুলিপি পরিবর্তনযোগ্য পরিবর্তনশীল পরিবর্তিত হয়।

পরিবর্তন

মিউটেবল অবজেক্টস এক্ষেত্রে কিছুটা আলাদা কাজ করে। যখন মান দ্বারা নির্দেশিত

In [16]: a = []

In [17]: b = a

In [18]: id(a)
Out[18]: 3071546412L

In [19]: id(b)
Out[19]: 3071546412L

A এবং b উভয়ই একই স্মৃতি অবস্থানের দিকে নির্দেশ করে।

In [20]: a.append(5)

একটি দ্বারা নির্দেশিত মেমরি অবস্থান পরিবর্তন করা হয় is

In [21]: a
Out[21]: [5]

In [22]: b
Out[22]: [5]

In [23]: id(a)
Out[23]: 3071546412L

In [24]: id(b)
Out[24]: 3071546412L

A এবং b উভয়ই এখনও একই মেমরির অবস্থানটির দিকে নির্দেশ করে। অন্য কথায়, পরিবর্তনীয় ভেরিয়েবলগুলি পরিবর্তনশীল দ্বারা চিহ্নিত একই মেমরি অবস্থানের পরিবর্তিত হয়, পরিবর্তিত পরিবর্তনশীল ক্ষেত্রে যেমন ভেরিয়েবল দ্বারা নির্দেশিত মানের একটি অনুলিপি তৈরির পরিবর্তে।

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