অজগর থেকে ডেল দরকারী কখন?


374

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

delঅজগর রাখার কি কোনও কারণ আছে , বা এটি পাইথনের প্রাক-আবর্জনা সংগ্রহের দিনগুলির একটি উত্তেজনা?


46
.তিহাসিক দ্রষ্টব্য : পাইথনের শুরু থেকেই আবর্জনা সংগ্রহ ছিল। ২.০ এর আগে পাইথনের আবর্জনা সংগ্রহকারী রেফারেন্সের চক্রটি সনাক্ত করতে পারেনি, তবে এর সাথে কিছুই করার ছিল না del
স্টিভেন রাম্বালস্কি

28
@ স্টিভেন রাম্বালক্সি, এর সাথে দেলের কিছু করার আছে। ডেল রেফারেন্স চক্র ভাঙ্গতে ব্যবহৃত হয়েছিল।
উইনস্টন এওয়ার্ট

6
তবে delপ্রাক-আবর্জনা সংগ্রহের সন্ধান নয় কারণ আপনি সর্বদা থাকতে পারতেন used = None। এটির জন্য নির্দিষ্ট সিনট্যাক্সটি বরাবরই বোধগম্য হয়। যেহেতু আমাদের এখন সিলিকাল জিসি রয়েছে তাই আপনি যে কোনও ক্ষেত্রে ব্যবহার করতে চান সেগুলি ছোট।
উইনস্টন এওয়ার্ট

3
> এবং বেশিরভাগ ভাষায় মনে হয় তেমন কীওয়ার্ড নেই বেশিরভাগ আবর্জনা সংগ্রহ করা ভাষাগুলি (বা কেবল এটি GC এর প্রতি ইঙ্গিত করতে ব্যবহার করে না যে এটি পরিবর্তনশীল সংগ্রহ করতে পারে)। সর্বাধিক পুরানো ভাষাটি করেছে: - কুইকব্যাসিকের মতো ভাল পুরানো বেসিক ভাষাগুলিতে ERASE(নির্দিষ্ট ভেরিয়েবলগুলি মেরে ফেলতে পারে) এবং CLEAR( সমস্ত ভেরিয়েবলগুলি মেরে ফেলতে পারে )
ডায়াক ইয়াক

উত্তর:


498

প্রথমত, আপনি স্থানীয় ভেরিয়েবলগুলি ছাড়াও অন্যান্য জিনিস ডেল করতে পারেন

del list_item[4]
del dictionary["alpha"]

উভয়ই স্পষ্টভাবে কার্যকর হওয়া উচিত। দ্বিতীয়ত, delএকটি স্থানীয় ভেরিয়েবল ব্যবহার করে অভিপ্রায়টি আরও পরিষ্কার হয়। তুলনা করা:

del foo

প্রতি

foo = None

আমি জানি del fooযে ক্ষেত্রে উদ্দেশ্যটি পরিবর্তনশীলকে সুযোগ থেকে সরানো। এটি যে পরিষ্কার foo = Noneকরছে তা পরিষ্কার নয় । যদি কাউকে সুনির্দিষ্টভাবে নিয়োগ করা হয় তবে foo = Noneআমি মনে করি এটি ডেড কোড। তবে আমি তাত্ক্ষণিকভাবে জানি যে কোডগুলি কেউ কী del fooকরার চেষ্টা করছে।


51
+1, হ্যাঁ আপনি যখন কোন কিছু বরাদ্দ করেন, এটি পরে এটি ব্যবহার করার একটি অভিপ্রায় জানায়। আমি কেবল সত্যই delস্মৃতি-নিবিড় গণনাগুলিতে ব্যবহৃত দেখেছি , কিন্তু যখন আমি এটি দেখলাম তখনই বুঝতে পারলাম এটি প্রয়োজনীয় কেন।
স্পষ্টভাবে

17
একটি তালিকা বা অভিধান থেকে মুছে ফেলার ব্যবহারের ক্ষেত্রে সহজেই কোনও পদ্ধতিতে প্রতিস্থাপন করা যেতে পারে (যেমনটি আমি প্রশ্নটিতে উল্লেখ করেছি)। আমি নিশ্চিত নই যে আমি অভিপ্রায় সংকেত ব্যবহারের সাথে একমতdel (যেমন ভাষায় কোনও মন্তব্য না যুক্ত মন্তব্যও একই কাজ করতে পারে) তবে আমি মনে করি এটি সেরা উত্তর।
জেসন বেকার

6
@ জেসনবেকার, পদ্ধতিগুলিতে অনুমোদিত। স্লাইসগুলি এবং এগুলি মুছে ফেলা আরও একটি বিশুদ্ধরূপে যদিও কোনও পদ্ধতি ব্যবহার করে। হ্যাঁ, আপনি একটি মন্তব্য ব্যবহার করতে পারেন। তবে আমি মনে করি একটি বিবৃতি ব্যবহার করা আরও ভাল তবে ভাষার অংশ হিসাবে এটি একটি মন্তব্য।
উইনস্টন ইওয়ার্ট

2
@ জেসনবেকার: এটি কেবল উদ্দেশ্য সম্পর্কেই নয়, এই দুটি বাক্য গঠন দুটি খুব ভিন্ন জিনিস করে।
পাভেল Šিমেরদা

2
এটি সম্পর্কিত অভিধান থেকে মুছে ফেলার মাধ্যমেও এটি পরিচালনা করা হয়। আপনি len()একইভাবে ফাংশনটি বিতর্ক করতে পারেন । যদি এটি হয় তবে অনুসন্ধানটি মতামত হিসাবে বা এমনকি স্বাদ ভিত্তিক বন্ধ হয়ে থাকতে পারে। পাইথন কেবল পদ্ধতির উপর নির্ভর না করে মৌলিক ক্রিয়াকলাপগুলির জন্য আদিম সরবরাহ করে।
পাভেল Šimerda

161

কি করার এই অংশ রয়েছে del( পাইথন ভাষার উল্লেখ থেকে ):

কোনও নাম মুছে ফেলা স্থানীয় বা বিশ্বব্যাপী নেমস্পেস থেকে সেই নামটির বাঁধাই সরিয়ে দেয়

Noneএকটি নাম বরাদ্দ করা নামের স্থান থেকে নামের বাইন্ডিং সরিয়ে দেয় না।

(আমি মনে করি যে নাম বাঁধার অপসারণটি আসলে কার্যকর কিনা তা নিয়ে কিছুটা বিতর্ক হতে পারে that's তবে এটি অন্য একটি প্রশ্ন))


22
-1 পোস্টারটি স্পষ্টভাবে এটি ইতিমধ্যে বুঝতে পেরেছে, আপনি জিজ্ঞাসা করছেন কেন আপনি একটি নাম বাঁধাই অপসারণ করতে চান।
উইনস্টন ইওয়ার্ট

71
@ উইনস্টন ইওয়ার্ট: আমি নিশ্চিত নই যে পোস্টারটি বুঝতে পেরেছিল যে বিকল্প হিসাবে delনিয়োগের পরামর্শ দেওয়ার সাথে সাথে একটি নাম বাঁধাই মুছে ফেলা হয়েছে None
স্টিভেন রাম্বালস্কি

8
@ স্টিভেন, পোস্টারটি পরিষ্কারভাবে পরিবর্তনশীল (নাম মুছে ফেলা) মুছে ফেলার এবং কোনওোটাই বরাদ্দ করার বিপরীতে রয়েছে। আপনি যখন কেবলমাত্র কিছু বরাদ্দ করতে পারবেন না কেন আপনার চলকটি মুছে ফেলা উচিত তা তিনি দেখেন না। এর একই প্রভাব রয়েছে যে তারা পূর্বের নামটির সাথে আবদ্ধ ছিল যা কিছুটির রেফারেন্স প্রকাশ করে।
উইনস্টন ইওয়ার্ট

19
@ উইনস্টন ইওয়ার্ট: এটি আমার কাছে পরিষ্কার নয়। সম্ভবত এটি আপনার কাছে পরিষ্কার যে আপনি বলেছেন যে তারা "" একই প্রভাব ফেলেছিল যে রিলিজটি সেই নামের সাথে আগে যা আবদ্ধ ছিল তার রেফারেন্স "। তবে এটি (স্পষ্টভাবে?) পুরো গল্পটি নয় যে নামটি মুছার পরে কোনও নাম ব্যবহার করার চেষ্টাটি একটি উত্থাপন করে NameError। গ্রেগ হিউগিল এটি খুব আলাদা করে তোলে। এবং এটিই এই পার্থক্য যা পোস্টারটি আমার কাছে "স্পষ্টভাবে" কী বোঝে তা সম্পর্কে আপনার দৃ .় প্রতিবেদনের বিষয়টি তোলে।
স্টিভেন রাম্বালস্কি

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

44

যে delজায়গাগুলি আমি দরকারী পেয়েছি তা হল লুপগুলির জন্য বহিরাগত ভেরিয়েবলগুলি পরিষ্কার করা:

for x in some_list:
  do(x)
del x

এখন আপনি নিশ্চিত হতে পারেন যে আপনি লুপের বাইরে এটি ব্যবহার করলে এক্স অপরিবর্তিত থাকবে।


1
আপনার delলাইনটি এখানে ইন্টেন্টেড (অর্থাৎ লুপের অংশ) হওয়ার কথা?
স্যাম

11
@ সাম, না তারা উদ্দেশ্য করে না।
ব্যবহারকারী5319825

7
@ সাম না, এখানে ধারণাটি হ'ল লুপের শেষ পুনরাবৃত্তির পরে (কিছু_ তালিকার চূড়ান্ত উপাদানটিতে করণীয়) সম্পাদন করার পরে, এক্স কিছু_ তালিকার চূড়ান্ত মান হিসাবে একটি রেফারেন্স হিসাবে থাকবে। ডেল এক্স নিশ্চিত করে যে এটি এই হিসাবে নির্ধারিত থাকবে না।
ম্যাথু

12
NameError: name 'x' is not definedতালিকাটি খালি থাকলে এটি ঘটবে ।
WofWca

18

কোনও ভেরিয়েবল মুছে ফেলার বিষয়টি কোনওটিতে সেট করার চেয়ে আলাদা

ভেরিয়েবলের নামগুলি মুছে ফেলা delসম্ভবত এমন কিছু যা খুব কম ব্যবহৃত হয়, তবে এটি এমন একটি শব্দ যা কোনও কীওয়ার্ড ছাড়াই তুচ্ছভাবে অর্জন করা যায়নি। আপনি যদি লেখার মাধ্যমে একটি পরিবর্তনশীল নাম তৈরি করতে পারেন তবে a=1এটি দুর্দান্ত যে আপনি তাত্ত্বিকভাবে এটিকে মুছে ফেলাতে পারেন।

এটি কোনও কোনও ক্ষেত্রে ডিবাগিংকে আরও সহজ করে তুলতে পারে কারণ একটি মুছে ফেলা ভেরিয়েবল অ্যাক্সেস করার চেষ্টা করা একটি নেমরর বাড়িয়ে তুলবে।

আপনি শ্রেণীর উদাহরণের বৈশিষ্ট্যগুলি মুছতে পারেন

পাইথন আপনাকে এমন কিছু লিখতে দেয়:

class A(object):
    def set_a(self, a):
        self.a=a
a=A()
a.set_a(3)
if hasattr(a, "a"):
    print("Hallo")

আপনি যদি কোনও শ্রেণীর উদাহরণগুলিতে গতিযুক্ত বৈশিষ্ট্য যুক্ত করতে চান, আপনি অবশ্যই তা লিখে এটি পূর্বাবস্থায় ফিরিয়ে আনতে সক্ষম হতে চান

del a.a

16

আপনি কখন কোন ব্যতিক্রম পরিদর্শন delকরতে ব্যবহার করছেন যখন আপনার কখন ব্যবহার করা উচিত (অন্য কেউ থাকতে পারে তবে আমি এই এক হাতের বিষয়ে জানি) এর একটি নির্দিষ্ট উদাহরণ রয়েছে sys.exc_info()। এই ফাংশনটি একটি টুপল, উত্থাপিত ব্যতিক্রমের ধরণ, বার্তা এবং একটি ট্রেসব্যাক প্রদান করে।

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

try:
    do_evil()
except:
    exc_type, exc_value, tb = sys.exc_info()
    if something(exc_value):
        raise

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

try:
    do_evil()
except:
    exc_type, exc_value, tb = sys.exc_info()
    del tb
    if something(exc_value):
        raise

বৃত্তাকার রেফারেন্স ভাঙতে। অনেক ক্ষেত্রে যেখানে আপনি কল করতে চান করবে sys.exc_info()ক্লাসের অধীনে একটি ক্লাস যাদু করেন, ট্রেসব্যাক হয় তাই আপনি নিশ্চিত করুন যে আপনি এটা পরিষ্কার করার আগে আপনাকে সম্ভবত ব্যতিক্রম হ্যান্ডলার চলে যাবে করতে হবে, দরকারী। আপনার যদি ট্রেসব্যাকের প্রয়োজন না হয় তবে আপনার এটি অবিলম্বে মুছে ফেলা উচিত, বা কেবল করুন:

exc_type, exc_value = sys.exc_info()[:2]

সব একসাথে এড়াতে।


18
এটি আর সত্য নয় যে আবর্জনা সংগ্রহকারী এটি সংগ্রহ করবেন না। তবে চক্রটি সংগ্রহ করতে বিলম্ব করবে।
উইনস্টন ইওয়ার্ট

এটি খুব প্রাসঙ্গিক নয় এবং অপের প্রশ্নের উত্তর দেয় না।
নটহাগো

15

অন্য একটি চিন্তাভাবনা।

জ্যাঙ্গোর মতো কাঠামোয় HTTP অ্যাপ্লিকেশনগুলি ডিবাগ করার সময়, কলটি স্ট্যাকের পূর্বে ব্যবহৃত অকেজো এবং বিশৃঙ্খল ভেরিয়েবলগুলি পূর্ণ, বিশেষত যখন এটি খুব দীর্ঘ তালিকার জন্য থাকে তবে বিকাশকারীদের জন্য খুব বেদনাদায়ক হতে পারে। সুতরাং, এই মুহুর্তে, নেমস্পেস নিয়ন্ত্রণটি কার্যকর হতে পারে।


12

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


11

উপরের উত্তরে কয়েকটি পয়েন্ট যুক্ত করতে: del x

ইঙ্গিতগুলির সংজ্ঞা ( কোনও বস্তুর প্রতি xনির্দেশিত r -> oএকটি রেফারেন্স ) তবে পরিবর্তে পরিবর্তিত হয় । এটি রেফারেন্সের (পয়েন্টার) একটি অপারেশন যা বস্তুর সাথে সম্পর্কিত না হয়ে যুক্ত । এর মধ্যে পার্থক্য করা এবং এখানে কী।rodel xroxro

  • এটি এটিকে সরিয়ে দেয় locals()
  • সেখান থেকে globals()থাকলে এটি সরিয়ে দেয় x
  • এটিকে স্ট্যাক ফ্রেম থেকে সরিয়ে দেয় (এটি থেকে শারীরিকভাবে রেফারেন্সটি সরিয়ে দেয়, তবে বস্তুটি নিজে বস্তু পুলে থাকে এবং স্ট্যাক ফ্রেমে থাকে না)।
  • এটি বর্তমান সুযোগ থেকে সরিয়ে দেয়। স্থানীয় ভেরিয়েবলের সংজ্ঞা দেওয়ার সময়সীমা সীমিত করতে এটি খুব দরকারী, যা অন্যথায় সমস্যা সৃষ্টি করতে পারে।
  • এটি বিষয়বস্তুর সংজ্ঞা পরিবর্তে নাম ঘোষণার বিষয়ে আরও বেশি।
  • এটি কোথায় xসম্পর্কিত তা প্রভাবিত করে, যেখানে xনির্দেশ করে না। স্মৃতিতে একমাত্র শারীরিক পরিবর্তন এটি। উদাহরণস্বরূপ যদি xকোনও অভিধান বা তালিকায় থাকে তবে এটি (একটি রেফারেন্স হিসাবে) সেখান থেকে সরানো হবে (এবং অবজেক্ট পুল থেকে অগত্যা নয়)। এই উদাহরণে, অভিধানটি এটি সম্পর্কিত হ'ল স্ট্যাক ফ্রেম ( locals()), যা ওভারল্যাপ করে globals()

6

Numpy.load ব্যবহারের পরে একটি ফাইল বন্ধ করতে জোর করুন:

সম্ভবত একটি কুলুঙ্গি ব্যবহার কিন্তু ব্যবহার করার সময় আমি এটি দরকারী বলে মনে করি numpy.load একটি ফাইল পড়তে করার সময় । প্রতি একবারে আমি ফাইলটি আপডেট করব এবং একই নামের একটি ফাইল ডিরেক্টরিতে কপি করতে হবে।

আমি delফাইলটি প্রকাশ করতাম এবং আমাকে নতুন ফাইলে অনুলিপি করার অনুমতি দিত।

দ্রষ্টব্য আমি withকমান্ড লাইনে প্লট নিয়ে ঘুরে বেড়াচ্ছিলাম এবং ট্যাবটি খুব বেশি চাপতে চাইনি বলে প্রসঙ্গ পরিচালককে এড়াতে চাই!

এই প্রশ্নটি দেখুন ।


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

2
সাবধান! এটি আবশ্যকতার বিশদ হিসাবে ভাষা স্পেসিফিকেশন গ্যারান্টি দেয় না যখন __del__()আবর্জনা সম্পর্কিত জিনিসগুলিতে পদ্ধতিটি কল করা হয় বা এমনকি যদি এটি একেবারে বলা হয়। সুতরাং যে এপিআইগুলি রিসোর্সগুলি ছেড়ে দেওয়ার কোনও উপায় দেয় না এই __del__()পদ্ধতিটি আশা করে ছাড়া কিছু সময় বলা হয় (অবজেক্টটি আবর্জনার পরে শীঘ্রই) কিছুটা ভাঙ্গা হয়ে যায়।
ব্ল্যাকজ্যাক

6

del__init__.pyফাইলগুলিতে প্রায়শই দেখা যায় । কোনও __init__.pyফাইলে সংজ্ঞায়িত যে কোনও বৈশ্বিক পরিবর্তনশীল স্বয়ংক্রিয়ভাবে "রফতানি" হয় (এটি একটিতে অন্তর্ভুক্ত হবে from module import *)। এটি এড়ানোর এক উপায় হ'ল সংজ্ঞা দেওয়া __all__, তবে এটি অগোছালো হতে পারে এবং প্রত্যেকে এটি ব্যবহার করে না।

উদাহরণস্বরূপ, যদি আপনি কোড ছিল __init__.pyমত

import sys
if sys.version_info < (3,):
    print("Python 2 not supported")

তারপরে আপনার মডিউলটি sysনামটি রফতানি করবে । পরিবর্তে আপনার লেখা উচিত

import sys
if sys.version_info < (3,):
    print("Python 2 not supported")

del sys

4

কীসের delজন্য ব্যবহার করা যায় তার উদাহরণ হিসাবে আমি এটির মতো পরিস্থিতিগুলি দরকারী বলে মনে করি:

def f(a, b, c=3):
    return '{} {} {}'.format(a, b, c)

def g(**kwargs):
    if 'c' in kwargs and kwargs['c'] is None:
        del kwargs['c']

    return f(**kwargs)

# g(a=1, b=2, c=None) === '1 2 3'
# g(a=1, b=2) === '1 2 3'
# g(a=1, b=2, c=4) === '1 2 4'

এই দুটি ফাংশন বিভিন্ন প্যাকেজ / মডিউলগুলিতে থাকতে পারে এবং প্রোগ্রামারটির ডিফল্ট মান আর্গুমেন্ট কী তা জানতে হবে cনাf আসলে আছে। সুতরাং ডেল এর সাথে সম্মিলিতভাবে কাওয়ার্গস ব্যবহার করে আপনি এটি কোনওটিতে সেট না করে "আমি সিটিতে ডিফল্ট মান চাই" বলতে পারেন (বা এই ক্ষেত্রে এটি ছেড়েও দিন)।

আপনি যেমন কিছু দিয়ে একই জিনিস করতে পারে:

def g(a, b, c=None):
    kwargs = {'a': a,
              'b': b}
    if c is not None:
        kwargs['c'] = c

    return f(**kwargs)

তবে আমি আগের উদাহরণটি আরও DRY এবং মার্জিত খুঁজে পাই।


3

অজগর থেকে ডেল দরকারী কখন?

আপনি এটি স্লাইস সিনট্যাক্সের পরিবর্তে অ্যারের একক উপাদান অপসারণ করতে ব্যবহার করতে পারেন x[i:i+1]=[]। উদাহরণস্বরূপ আপনি যদি আছেন os.walkএবং ডিরেক্টরিতে কোনও উপাদান মুছতে চান তবে এটি কার্যকর হতে পারে । যদিও আমি এর জন্য কোনও কীওয়ার্ডকে দরকারী হিসাবে বিবেচনা করব না, যেহেতু কেউ কেবল একটি [].remove(index)পদ্ধতি তৈরি করতে পারে ( .removeপদ্ধতিটি আসলে সন্ধান-এবং-অপসারণ-প্রথম-উদাহরণ-এর-মূল্য)।


7
[].pop(index)এবং [].remove(item)"index"মান সম্পর্কে কথা বলার সময় নাম পরিবর্তনশীল ব্যবহার করবেন না , এটিকে বিভ্রান্তিকর দেখায়।
স্কি

@ স্কি পপ সূচক ব্যবহার করে । এটি একটি বৈধ উত্তর যেখানে এই উত্তরগুলির অর্ধেকটি ডেল ব্যবহার করে একটি উদাহরণ দেয় যেখানে কোনওটিও কাজ করবে না। কোনটিতে সেট করা একটি তালিকা অবজেক্ট এখনও তালিকায় নেই যেখানে আইটেমগুলি অপসারণ করা হয়।
ব্যবহারকারী5389726598465

3

delনম্পির সাথে বড় ডেটা পরিচালনা করার সময় আমি সিউডো-ম্যানুয়াল মেমরি পরিচালনার জন্য দরকারী বলে মনে করেছি । উদাহরণ স্বরূপ:

for image_name in large_image_set:
    large_image = io.imread(image_name)
    height, width, depth = large_image.shape
    large_mask = np.all(large_image == <some_condition>)
    # Clear memory, make space
    del large_image; gc.collect()

    large_processed_image = np.zeros((height, width, depth))
    large_processed_image[large_mask] = (new_value)
    io.imsave("processed_image.png", large_processed_image)

    # Clear memory, make space
    del large_mask, large_processed_image; gc.collect()

পাইথন জিসি রাখতে না পারলে সিস্টেমটি পাগলের মতো অদলবদল করে গ্রাইন্ডিং স্টলে স্ক্রিপ্ট আনার মধ্যে পার্থক্য হতে পারে এবং এটি একটি আলগা মেমরির প্রান্তিকের নীচে পুরোপুরি মসৃণ চলছে যা ব্রাউজ করার জন্য মেশিনটি প্রচুর পরিমাণে ব্যবহার করতে পারে এবং কোড এটি কাজ করার সময়।


2

আমি মনে করি যে ডেলের নিজস্ব সিনট্যাক্স থাকার একটি কারণ হ'ল এটি একটি ফাংশনটির সাথে প্রতিস্থাপন করা নির্দিষ্ট ক্ষেত্রে নির্দিষ্ট হতে পারে যে এটি বাইন্ডিং বা ভেরিয়েবলের উপর পরিচালিত হয় এবং এটির মান উল্লেখ না করে। সুতরাং যদি ডেলের একটি ফাংশন সংস্করণ তৈরি করা হয় তবে একটি প্রসঙ্গটি পাস করা দরকার del ডেল ফোওকে গ্লোবাল () শুরু করা ('ফু') বা স্থানীয় () মুছে ফেলুন ('ফু') যা অগোছালো হয়ে যায় become এবং কম পাঠযোগ্য। তবুও আমি বলছি এর আপাত বিরল ব্যবহারের কারণে ডেল থেকে মুক্তি পাওয়া ভাল। তবে ভাষার বৈশিষ্ট্য / ত্রুটিগুলি অপসারণ করা বেদনাদায়ক হতে পারে। হয়তো অজগর 4 এটি সরিয়ে দেবে :)


2

ভেরিয়েবল নির্ধারণের সাথে এর Noneসাথে মুছে ফেলার মধ্যবর্তী সংক্ষিপ্তসারটি হাইলাইট করার জন্য আমি স্বীকৃত উত্তরের বিবরণ দিতে চাই del:

ভেরিয়েবল foo = 'bar'এবং নিম্নলিখিত ফাংশন সংজ্ঞা দেওয়া হয়েছে:

def test_var(var):
    if var:
        print('variable tested true')
    else:
        print('variable tested false')

একবার প্রাথমিকভাবে ঘোষণা করা হলে, প্রত্যাশা অনুযায়ী test_var(foo)ফলনvariable tested true

এখন চেষ্টা করুন:

foo = None
test_var(foo)

যা ফলন দেয় variable tested false

এই আচরণের সাথে বৈষম্য করুন:

del foo
test_var(foo)

যা এখন উত্থাপন NameError: name 'foo' is not defined


0

তবুও অন্য কুলুঙ্গির ব্যবহার: ROOT5 বা ROOT6 সহ পাইরোটে, "দেল" একটি অজগর অবজেক্টটি সরাতে কার্যকর হতে পারে যা কোনও দীর্ঘস্থায়ী সি ++ অবজেক্টকে উল্লেখ করে। এটি পাইরোটের গতিশীল চেহারাটিকে একটি অভিন্ন নামযুক্ত সি ++ অবজেক্ট সন্ধান করতে এবং পাইথন নামের সাথে আবদ্ধ করতে দেয় allows সুতরাং আপনি যেমন একটি পরিস্থিতিতে থাকতে পারে:

import ROOT as R
input_file = R.TFile('inputs/___my_file_name___.root')
tree = input_file.Get('r')
tree.Draw('hy>>hh(10,0,5)')
R.gPad.Close()
R.hy # shows that hy is still available. It can even be redrawn at this stage.
tree.Draw('hy>>hh(3,0,3)') # overwrites the C++ object in ROOT's namespace
R.hy # shows that R.hy is None, since the C++ object it pointed to is gone
del R.hy
R.hy # now finds the new C++ object

আশা করি, এই কুলুঙ্গিটি ROOT7 এর স্যানার অবজেক্ট ম্যানেজমেন্টের সাথে বন্ধ হয়ে যাবে।


0

"ডেল" কমান্ড একটি অ্যারে ডেটা নিয়ন্ত্রণের জন্য খুব দরকারী, উদাহরণস্বরূপ:

elements = ["A", "B", "C", "D"]
# Remove first element.
del elements[:1]
print(elements)

আউটপুট:

['বি', 'সি', 'ডি']


-2

একবার আমাকে ব্যবহার করতে হয়েছিল:

del serial
serial = None

কারণ শুধুমাত্র ব্যবহার:

serial = None

সিরিয়াল বন্দরটি তাৎক্ষণিকভাবে আবার খোলার জন্য পর্যাপ্ত পরিমাণে ছাড়েনি release এই পাঠটি থেকে আমি শিখেছি যে এর delপ্রকৃত অর্থ: "এখনই জিসি! এবং এটি না হওয়া পর্যন্ত অপেক্ষা করুন" এবং এটি অনেক পরিস্থিতিতে সত্যই কার্যকর। অবশ্যই, আপনি একটি হতে পারে system.gc.del_this_and_wait_balbalbalba(obj)


5
হুম ... আসলেই এটির কোনও পার্থক্য করা উচিত ছিল না। যদিও, সম্ভবত এটি প্রকাশিত অতিরিক্ত বিলম্বের দ্বারা আপনার সমস্যাটি স্থির হয়েছিল?
উইনস্টন ইওয়ার্ট

3
আমি মনে করি না আপনি এখন কোনও ডকুমেন্টেশনের মাধ্যমে জিসিকে এটি ব্যাক করতে পারেন । আমি মনে করি জিসির উপর ভরসা করা এবং কল করা __del__()পাইথনে সর্বদা ভুল (যদিও আমি এই নকশার কারণগুলি জানি না) এবং প্রসঙ্গ পরিচালক হিসাবে ব্যবহার করা আরও ভাল ( withবিবৃতি) better
পাভেল Šimerda

1
এটি একধরনের ভুডু প্রোগ্রামিং। ___ __ () এর জন্য অবজেক্টের জন্য ডকুমেন্টেশনে পদ্ধতির বিবরণ এবং নোটটি দেখুন, এবং মনে রাখবেন এটি কেবল সিপিথনের বর্তমান প্রয়োগকে রেফারেন্স গণনা সহ বর্ণনা করে। অন্যান্য পাইথন বাস্তবায়ন (পাইপাই, জাইথন, আয়রন পাইথন, ব্রাইথন, ...) বা ভবিষ্যতের সিপথন বাস্তবায়নগুলি একটি পৃথক আবর্জনা সংগ্রহের পরিকল্পনা ব্যবহার করতে পারে। জাইথন ​​জেভিএমস জিসি ব্যবহার করে যা অবিলম্বে অবজেক্টগুলি মুছবে না। serialমডিউল এছাড়াও Jython সাথে কাজ করে, তাই আপনার হ্যাক সেখানে কাজ করে না!
ব্ল্যাকজ্যাক

BTW gc.collect স্পষ্টভাবে জিনিসকে উপায় হবে। বেশিরভাগ অজগর বাস্তবায়নে সমর্থিত।
tdihp

-2

ডেল অনেক ভাষায় "আনসেট" এর সমতুল্য এবং ক্রস রেফারেন্স পয়েন্ট হিসাবে অন্য ভাষা থেকে অজগরের দিকে চলে যায় .. লোকেরা তাদের প্রথম আদেশে একই কাজ করে এমন আদেশগুলি সন্ধান করে ... এছাড়াও সেটিংস "" থেকে কোনও বার বা "সত্যই কোনও সুযোগ স্কোর থেকে সরিয়ে দেয় না ... কেবল তার মানটি খালি করে তার বর্ণের নামটি এখনও মেমরিতে সংরক্ষণ করা হবে ... কেন?!?" একটি স্মৃতি নিবিড় স্ক্রিপ্টে ... কেবল তার নং এর পিছনে আবর্জনা রাখা এবং যাইহোক ... প্রতিটি ভাষার বাইরে কোনও "অফসেট / ডিলিট" সংস্করণ রয়েছে যা অজগর নয়?


7
delআবর্জনা সংগ্রহকারীকে এর চেয়ে দ্রুত আর কোনও আহ্বান জানায় না = None, হয় দীর্ঘমেয়াদে আবর্জনা ফেলে রাখবে না। আপনি পাইথনের আবর্জনা সংগ্রহ করতে চান।
সিলভারব্যাক

-3

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


3
আমি এর প্রমাণ দেখতে চাই। কারওও নিয়োগ দেওয়া রেফারেন্স গণনা হ্রাস করা উচিত নয়।
জেসন বেকার

3
এটি একটি আজেবাজে কথা এবং আবর্জনা সংগ্রহের বিপরীতে (এই ময়লা আবর্জনা ফেলে রাখা অর্থে)।
পাভেল Šimerda
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.