मैं लूप के लिए अप्रयुक्त चर घोषित करने के आसपास कैसे प्राप्त कर सकता हूं?


87

अगर मेरे पास इस तरह की एक सूची समझ है (उदाहरण के लिए):

['' for x in myList]

प्रभावी रूप से एक नई सूची बनाना जिसमें एक सूची में प्रत्येक तत्व के लिए एक खाली स्ट्रिंग है, मैं कभी भी उपयोग नहीं करता हूं x। क्या यह लिखने का एक साफ-सुथरा तरीका है, इसलिए मुझे अप्रयुक्त xचर को घोषित करने की आवश्यकता नहीं है?

जवाबों:


130

_ एक लूप और टपल असाइनमेंट में उपेक्षित सदस्यों के लिए एक मानक प्लेसहोल्डर नाम है, उदा

['' for _ in myList]

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

BTW आपकी सूची सूची समझ के बिना लिखी जा सकती है (यह मानते हुए कि आप अपरिवर्तनीय सदस्यों जैसे स्ट्रिंग्स, पूर्णांक आदि की सूची बनाना चाहते हैं)।

[''] * len(myList)

10
उत्तरार्द्ध को एक बड़ी चेतावनी के साथ होना चाहिए कि यह उत्परिवर्तित वस्तुओं के लिए अपेक्षित काम नहीं करता है।

5
@Mohit:a=[[]]*4;a[0].append(5);print(a)
kennytm

@ रेमी: मोहित ने एक स्पष्टीकरण पोस्ट किया लेकिन इसे हटा दिया गया: एस वैसे भी, डॉक्सहोमथॉन . org/py3k/library/ … में नोट्स 2 की जांच करें ।
kennytm

2
@ राम, पायथन स्मृति में एक ही वस्तु के लिए एक ही संदर्भ रखता है।
मोहित रांका

forउदाहरण के लिए, यदि मैं नेस्टेड लूप कर रहा हूं, तो क्या इससे कोई फर्क नहीं पड़ता ? या अगर अंदर for _ in range(...)मैं कहना चाहता हूँ _, var = f(x)? क्या यह दो _चर के बीच उलझ जाएगा ?
एरिक औलद

19

नहीं। जैसा कि ज़ेन कहता है: नियम तोड़ने के लिए विशेष मामले पर्याप्त नहीं हैं। विशेष मामले की वस्तुओं को पुनरावृत्त होने वाली वस्तुओं का उपयोग नहीं करने और नियम यह है कि अनपैक करने के लिए "लक्ष्य" है।

हालाँकि, आप _परिवर्तनशील नाम के रूप में उपयोग कर सकते हैं, जिसे आमतौर पर "जानबूझकर अप्रयुक्त" के रूप में समझा जाता है (यहां तक ​​कि PyLint आदि यह जानता है और इसका सम्मान करता है)।


PyLint हालांकि शिकायत करता है कि C: 10,24: Invalid variable name "_" (invalid-name)जब तक आप इसे good-namesअपने में नहीं जोड़ते .pylintrc
जियोर्जियोसिरोनी

12

यह पता चला है कि प्रयोग dummy*(शुरुआती शब्द डमी है) जैसा कि चर नाम के समान है __एक ज्ञात मानक है और सार्थक परिवर्तनीय नामों का उपयोग करना बेहतर होगा। आप उपयोग कर सकते हैं तो dummy, dummy1, dummy_anything। इन चर नामों का उपयोग करके PyLintशिकायत नहीं होगी।


मैं वास्तव में इस दृष्टिकोण को पसंद करता हूं। यह सार्थक रहता है।
RvdK

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))

चाल चलनी चाहिए। ध्यान दें कि x को जनरेटर की समझ से बाहर एक चर के रूप में परिभाषित नहीं किया गया है।


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

आप i और j दोनों देख सकते हैं, एक ही ऑब्जेक्ट को मेमोरी में देखें। क्या होता है, जब हम एक अपरिवर्तनीय चर के मान को बदलते हैं।

In [5]: j = j+1

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

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

आप देख सकते हैं कि j अब एक नए स्थान को इंगित करना शुरू करता है, (जहां 2 संग्रहीत है), और मैं अभी भी उस स्थान को इंगित करता हूं जहां 1 संग्रहीत है। मूल्यांकन करते समय,

j = j+1

मान 142671248 से लिया गया है, गणना की गई (यदि पहले से कैश नहीं की गई है), और एक नए स्थान पर डाल दी गई है 142671236. j को नए स्थान पर इंगित करने के लिए बनाया गया है। सरल शब्दों में, हर बार एक अपरिवर्तनीय चर बनाया गया एक नई प्रति संशोधित की जाती है।

अस्थिरता

म्यूटेबल ऑब्जेक्ट इस संबंध में बहुत कम कार्य करते हैं। जब मूल्य द्वारा इंगित किया गया

In [16]: a = []

In [17]: b = a

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

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

दोनों और बी एक ही मेमोरी लोकेशन की ओर इशारा करते हैं।

In [20]: a.append(5)

एक द्वारा इंगित मेमोरी स्थान संशोधित है।

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

दोनों और बी, अभी भी एक ही मेमोरी स्थान की ओर इशारा करते हैं। दूसरे शब्द में, परिवर्तनशील परिवर्तनीय चर मामले की तरह चर द्वारा बताए गए मान की एक प्रति बनाने के बजाय, चर द्वारा बताए गए समान मेमोरी स्थान का उत्परिवर्तनीय चर कार्य करता है।


इसके लिए धन्यवाद, लेकिन मुझे वास्तव में यकीन नहीं है कि इसका सवाल क्या है। (नहीं, मैंने कोई बात नहीं की)
रामी १13
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.