পাইথনে পরিষ্কার পরিবর্তনশীল


207

অজগরটিতে কোনও ভেরিয়েবলের মান সাফ করার উপায় আছে কি?

উদাহরণস্বরূপ যদি আমি একটি বাইনারি গাছ বাস্তবায়ন করতাম:

Class Node:
    self.left = somenode1
    self.right = somenode2

আমি যদি গাছ থেকে কিছু নোড সরিয়ে নিতে চাই, তবে আমাকে self.leftখালি রাখতে হবে।


উত্তর:


157

এর সাথে কী হয়েছে self.left = None?


19
নন কীওয়ার্ডের সাথে পরিচিত নয়। এটি কি অন্যান্য ভাষায় নালার মতো?
বিনিচোলাস

6
হ্যাঁ; এটি নাল সমান।
স্মিশেরি

12
@ বিনিচোলস যদিও nullপিএইচপি-তে এটি পছন্দ নয় , পিএইচপি-তে পরিবর্তনশীল নির্ধারণ করা nullবেশিরভাগ ক্ষেত্রে আপনাকে একইরকম আচরণ দেয় যেমন আপনি এটি প্রথম স্থানে সংজ্ঞায়িত করেননি। Noneপাইথনের একটি মান একটি অপরিজ্ঞাত ভেরিয়েবলের থেকে একেবারে আলাদা। Noneবেশিরভাগ অন্যান্য অবতারের মতো null, তবে (যতক্ষণ না আমরা আরও কম তদন্তের বিশদটি না পেয়ে)।
বেন

এটি কোনও কীওয়ার্ড নয়; এটি একটি অন্তর্নির্মিত বস্তুর জন্য সেট-বাই-ডিফল্ট নাম। আপনি Noneঅনির্ধারিত ধরণের যে কোনও "প্লেইন" অবজেক্টের সাথে যা কিছু করতে পারেন তা করতে পারেন: এটি পাত্রে সংরক্ষণ করুন, এটির একটি স্ট্রিং উপস্থাপনা মুদ্রণ করুন, এটিতে কিছু মেটাডেটা পরীক্ষা করুন ... যাইহোক, আপনি "অজগর নাল" এর জন্য গুগল চেষ্টা করেছিলেন? সমতুল্য"? আমি গুরুতর; এটি বিশ্লেষণে কিছুটা সময় নেবে, তবে তথ্যটি ঠিক সেখানে।
কার্ল নচেটেল

18
পাইথন টার্মিনালটি খুলুন এবং টাইপ করুন print xএবং এন্টার টিপুন। আপনি যখন একটি অপরিজ্ঞাত ভেরিয়েবল মুদ্রণের চেষ্টা করবেন তখন বেশিরভাগ ভাষার মতো এটিও দোভাষী দোষ তৈরি করে produce তবে আপনি যদি ভেরিয়েবলটি সংজ্ঞায়িত করেন এবং তারপরে কোনটি দিয়ে এটি সাফ করার চেষ্টা করেন, print xকোড ব্যবহার করে শব্দটি Noneআউটপুট হিসাবে উত্পন্ন হয়। আমি অজগরে নতুন তাই আমার ভুল হতে পারে, তবে এটি পরিষ্কার হওয়া ভেরিয়েবলের আচরণের মতো বলে মনে হয় না।
Musixauce3000

407

delশব্দ করতে হবে।

>>> a=1
>>> a
1
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined

তবে এক্ষেত্রে আমি ভোট দিয়েছি self.left = None


18
কখনও কখনও এটি পুরোপুরি সরিয়ে দেয় না এটি কেবল স্মৃতিতে থাকা সেই উল্লেখটিকে সরিয়ে দেয়। এটি ভ্রান্ত ভেরিয়েবলগুলিকে মেমরিতে ছেড়ে দিতে পারে যা গিসি পায় না।
জাকব বোয়ের

4
delএর অসুবিধেও রয়েছে যে আপনি যদি এমন কোনও পরিবর্তনশীল মুছতে চেষ্টা করেন যা বিদ্যমান না থাকে তবে এটি একটি ব্যতিক্রম ছুঁড়ে দেয়, যা সাধারণত অনাকাঙ্ক্ষিত।
ফিলিপ কেয়ার্নস

33
আমি কেবল উল্লেখ করতে চেয়েছিলাম যে আপনি যদি দুর্ঘটনাক্রমে কমান্ডগুলিতে নির্মিত একটি ওভারর্টিংয়ের পরিবর্তনশীল ঘোষণা করে যেমন, type=… আপনি যখন টাইপ করতে চেয়েছিলেন type(…)তখন মুছলে মুছে ফেলাটাই আসল কার্যকারিতা ফিরে পাওয়ার সহজতম উপায়। এটি হ'ল, যদি আপনি এটিকে কোনও হিসাবে রাখেন না তবে আপনি এখনও অন্তর্নিহিত ফাংশনে অ্যাক্সেস ছাড়িয়ে যাবেন।
এমপেসার

1
আবর্জনা সংগ্রহ / সংগ্রাহক / সংগৃহীত
এমসিসিসি

1
এটিই আমি খুঁজছিলাম। সেমিডি লাইনে খেলে আমার ... ছিল set = set(myList)এবং তখন বুঝতে পেরেছিলাম যে আমি আর সেটটিকে ফাংশন (দোহ) হিসাবে ব্যবহার করতে পারি না। ব্যবহার করে del setআমাকে আবার এফএক্স হিসাবে ব্যবহার করার অনুমতি দিয়েছে। অবশ্যই আমি কোনও আসল স্ক্রিপ্টে সেই সংরক্ষিত ভার ব্যবহার করব না।
জেবিচর্চিল

111

var = None "মানটি সাফ করে", ভেরিয়েবলের মানটিকে "নাল" হিসাবে "কিছুই নয়" হিসাবে সেট করে, তবে ভেরিয়েবলের পয়েন্টারটি রয়ে যায়।

del var সম্পূর্ণরূপে চলকটির সংজ্ঞা সরিয়ে দেয়।

আপনি যদি পরে ভেরিয়েবলটি ব্যবহার করতে চান, তবে এর জন্য একটি নতুন মান নির্ধারণ করুন, যেমন ভেরিয়েবলটি বজায় রাখা Noneআরও ভাল।


আমি যদি সম্পূর্ণরূপে ভেরিয়েবল মুছতে চাই যা কিছু পরিস্থিতিতে বিদ্যমান না। ত্রুটি এড়াতে কোনও প্যারামিটার আছে? আমাকে বেশ কয়েকটি ভেরিয়েবল মুছতে হবে: ডেল এ, বি, সি, ডি আমি লুপ ব্যবহার করতে পারি এবং চেষ্টা করতে / বাদ দিয়ে চেষ্টা করতে পারি তবে আমি এড়াতে কিছু পরিবর্তন পছন্দ করি।
টেডো ভার্বানেক

63

আসলে, এটি ভেরিয়েবল / সম্পত্তি মুছবে না। এটি যা করবে তা তার মানটিকে সেট করে None, সুতরাং ভেরিয়েবলটি এখনও মেমরিতে স্থান গ্রহণ করবে। আপনি যদি মেমরি থেকে ভেরিয়েবলের সমস্ত অস্তিত্ব পুরোপুরি মুছতে চান তবে আপনি কেবল টাইপ করতে পারেন:

del self.left

8
আমি বুঝতে পারছি না কেন = কোন উত্তরটি এত জনপ্রিয়। এটি সঠিক উত্তর
নিকোলে গ্রোমভ

1
ওপি বলেছে clearনা remove। ডেল বৈশিষ্ট্য এবং অনুসন্ধানগুলিকে হত্যা করবে। এটি যে কোনওটিতে সেট করা ভাল উপায়, আপনি if self.leftযা পরীক্ষা করতে পারেন তার চেয়ে কোনও নোড ফাঁকা আছে কিনা তা যাচাই করার পক্ষে এটি যথেষ্ট ভাল।
ব্যবহারকারী 1767754

"এটিকে কোনওটিতে সেট করার উপায় পরিষ্কার নয়" - এটি বিবেচনা করার মতো বিষয় যে কেউ যদি (নিজেকে কিছুক্ষণ পরে বা কোনও সহযোগী) কোডটি পড়ছেন del, আইএমএইচও, এটি আরও স্পষ্ট করে তোলে যে 'মানসিকভাবে পার্সিংয়ের সময় পরিবর্তনশীলটি ভুলে যেতে পারে about ' কোড.
পকেটস্যান্ড

1
আপনার প্রতিদিনের কোডে নিকোলে গ্রোমোভ যখন আপনি সেলফ-বেল্টের মান পেতে চান আপনি কি তা পরীক্ষা করতে পছন্দ করেন if self.left:বা আপনি কোনও সম্ভাব্য নেমরর ব্যতিক্রম নিয়ে কাজ করতে পছন্দ করেন যা আপনি যদি সর্বত্র পরিচালনা না করেন তবে আপনার প্রোগ্রামটি ক্র্যাশ হয়ে যাবে ?
পিয়েরে.সাসৌলাস 23'19

33
  • যদি পুরোপুরি মুছতে চান তবে এটি ব্যবহার করুন del:

    del your_variable

  • অথবা অন্যথায়, মান তৈরি করতেNone :

    your_variable = None

  • যদি এটি পুনরাবৃত্ত হয় (যেমন একটি তালিকা বা টিপল), আপনি এটিকে খালি তৈরি করতে পারেন:

    your_variable.clear()

তাহলে your_variableখালি থাকবে


দ্বিতীয় বিকল্পের জন্য, "এর বিষয়বস্তুগুলি সাফ করুন" সঠিক নয়, এটি কেবল পরিবর্তনশীলটিকে কোনওরূপে পুনরায় স্বাক্ষর করবে না, মূল অবজেক্টটি এখনও থাকবে (যদি না এর রেফারেন্স গণনা শূন্যে হ্রাস পায় তবে এটি আবর্জনা সংগ্রহ করা হয় না)।
cs95

0

আপনি কি ভেরিয়েবল মুছতে চান, তাই না?

ঠিক আছে, আমি মনে করি @bnul উত্তরের একটি সেরা বিকল্প ধারণা পেয়েছি:

আপনি এর সাথে স্বতন্ত্র নামগুলি মুছতে পারেন del:

del x অথবা আপনি গ্লোবাল () অবজেক্ট থেকে এগুলি সরাতে পারেন:

for name in dir(): if not name.startswith('_'): del globals()[name]

এটি কেবল একটি উদাহরণ লুপ; এটি ডিফেন্সিয়ালি কেবল সেই নামগুলি মুছে দেয় যা কোনও আন্ডারস্কোর দিয়ে শুরু হয় না, এমন একটি ধারণা (অযৌক্তিক নয়) তৈরি করে যে আপনি কেবল আপনার অনুবাদকের শুরুতে আন্ডারস্কোর ছাড়া নাম ব্যবহার করেছেন। আপনি যদি সত্যই পুরোপুরি হতে চান তবে তার পরিবর্তে নামগুলি (শ্বেত তালিকা) রাখার জন্য আপনি হার্ড-কোডেড নাম ব্যবহার করতে পারেন। আপনার পক্ষে ক্লিয়ারিংয়ের জন্য কোনও অন্তর্নির্মিত ফাংশন নেই, কেবলমাত্র প্রস্থান করা এবং দোভাষীটি পুনরায় চালু করা ব্যতীত।

আপনি যে মডিউলগুলি আমদানি করেছেন (আমদানি ওএস) সেগুলি আমদানি করতে চলেছে কারণ সেগুলি sys.modules দ্বারা রেফারেন্স করা হয়; পরবর্তী আমদানি ইতিমধ্যে আমদানি করা মডিউল অবজেক্টটিকে পুনরায় ব্যবহার করবে। আপনার কাছে কেবলমাত্র আপনার বর্তমান বিশ্বব্যাপী নেমস্পেসে তাদের কাছে কোনও উল্লেখ নেই।

এই উত্তরটি পুনর্বিবেচনা করুন!


-1

আমি উপরে উল্লিখিত কয়েকটি বিকল্প ব্যবহার করেছি:

del self.left

বা ব্যবহার করে কারও কাছে মান নির্ধারণ করা

self.left = None

আপনি কোনওটি মান সেট না করে ব্যবহার করার সময় পার্থক্যগুলি জানা এবং কয়েকটি ব্যতিক্রম হ্যান্ডলার স্থাপন করা গুরুত্বপূর্ণ। আপনি যদি কোনও টেম্পলেট ব্যবহার করে শর্তাধীন বিবৃতিগুলির মান মুদ্রণ করেন তবে বলুন,

print("The value of the variable is {}".format(self.left))

আপনি ভেরিয়েবল মুদ্রণের মান দেখতে পাবেন "ভেরিয়েবলের মান কোনওটি নয়"। সুতরাং, আপনাকে সেখানে কয়েকটি ব্যতিক্রম হ্যান্ডলার রাখতে হবে:

if self.left:
    #Then only print stuff

উপরের কমান্ডটি কেবলমাত্র স্ব-বামে না থাকলে মানগুলি মুদ্রণ করবে None

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