ইন্টারপ্রেটারের স্মৃতি থেকে তৈরি করা ভেরিয়েবল, ফাংশন ইত্যাদি মুছে ফেলার কোনও উপায় আছে কি?


113

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

আমি যখন পাইথনের শেলটিতে থাকি, আমি টাইপ করি: dir()এবং আমি বর্তমান স্কোপে (প্রধান ব্লক) সমস্ত বস্তুর নাম দেখতে পাচ্ছি, এর মধ্যে 6 টি রয়েছে:

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']

তারপরে, যখন আমি কোনও ভেরিয়েবল ঘোষণা করি, উদাহরণস্বরূপ x = 10, এটি স্বয়ংক্রিয়ভাবে বিল্ট-ইন মডিউলটির অধীনে অবজেক্টগুলির তালিকাগুলিতে যুক্ত হয় dir()এবং যখন আমি dir()আবার টাইপ করি , এটি এখন দেখায়:

['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']

একই কাজ ফাংশন, ক্লাস এবং অন্যান্য জন্য।

শুরুতে যেখানে উপলব্ধ standard মান মুছে না ফেলে কীভাবে আমি এই সমস্ত নতুন অবজেক্ট মুছব?

আমি এখানে "মেমরি ক্লিনিং", "কনসোল পরিষ্কারের" সম্পর্কে পড়েছি, যা কমান্ড প্রম্পট উইন্ডো থেকে সমস্ত পাঠ মুছে ফেলেছে:

>>> import sys
>>> clear = lambda: os.system('cls')
>>> clear()

তবে আমি যা অর্জন করার চেষ্টা করছি তার সাথে এইগুলির কিছুই করার নেই, এটি সমস্ত ব্যবহৃত বস্তু পরিষ্কার করে না।


2
আপনি কেন এটি করার প্রয়োজন মনে করেন, বা আপনি কেবল কৌতূহল নিয়ে জিজ্ঞাসা করছেন?
প্রধানমন্ত্রী 2 রিং

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

1
আহ। FWIW, delঠিক একটি ফাংশন, অত কোন নয় (এবং )। এটি একটি কীওয়ার্ড যা একটি বিবৃতি উপস্থাপন করে। অবশ্যই এটি কীভাবে কোনও বস্তুকে মুছে ফেলতে এতে ফাংশন জড়িত হতে পারে তবে এটি অন্য গল্প ...
প্রধানমন্ত্রী 2 রিং

শেল নামগুলিতে পরীক্ষা করার সময় আপনি সেগুলি ব্যবহার না করা পছন্দ করেন xবা yব্যবহার করা উচিত নয় । অথবা যদি আপনি নির্বোধের মতো কিছু না করেন তবে আপনি সমস্ত ধরণের আবর্জনা জায়গাটি বিশৃঙ্খলা করতে পাবেন। :)from _somemodule_ import *
সন্ধ্যা 2 টা রিং

1
আমি এই প্রশ্নে আমার পথটি গুগল করেছিলাম এবং এখন আমি ভাবছি - আমি কেন কেবল কার্নেলটি পুনরায় আরম্ভ করতে পারি না এবং স্ক্রিপ্টটি উপরে থেকে আবার চালাতে পারি না যদি আমি যাইহোক সমস্ত ভেরিয়েবল এবং ফাংশন মুছতে চাই?
ভবঘুরে

উত্তর:


159

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

del x

বা আপনি globals()এটিকে বস্তু থেকে সরাতে পারেন :

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

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

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


ঠিক আছে, আমি বলতে হবে startswith('_')বেশ নির্বোধ বলে মনে হচ্ছে। যদি কেউ লেখার জন্য যথেষ্ট স্মার্ট _foo=42বা এমনকি হয় তবে __foo__=42কীভাবে আমরা এগুলি মুছতে পারি? প্রোগ্রামিয়ালি স্ট্যান্ডার্ড মডিউল বৈশিষ্ট্যগুলির নাম পাওয়ার কোনও উপায় আছে কি?
জর্জি

2
@ জর্জি: আমি লুপটি ডিফেন্সিভলি কোড করেছি। আপনি আরও ভাল করতে চাইলে আপনাকে প্রথমে নামের একটি হার্ডকোড রাখতে হবে।
মার্টিজন পিটারস

তো, কোন উপায় নেই? আমার চিন্তা ছিল dir(ModuleType()), কিন্তু এটি কেবল ফিরে আসে docএবং name
জর্জি

1
@ জর্জি: নাহ; দোভাষীর গ্লোবাল নেমস্পেস প্রকাশের সাথে সাথে প্রকাশের ক্ষেত্রেও পরিবর্তিত হয় এবং আপনি যখন পরবর্তী পর্যায়ে দোভাষীটি খোলেন তখন সেখানে কী ছিল তা গণনা করার জন্য বোকামিযুক্ত উপায় নেই (যা আমি জানি) ।
মার্টিজন পিটারস

1
@ নাকের ফাংশন এবং ক্লাসগুলি কেবল অন্য যেকোন বস্তুর মতো। তারা বিশেষ নয়; একটি শ্বেতলিস্ট ব্যবহার করুন বা ক্লাস এবং ফাংশন সংরক্ষণ করার জন্য আপনার প্রয়োজনীয় অবজেক্টের ধরণটি পরীক্ষা করুন।
মার্টিজন পিটারস

67

হ্যাঁ. আইপিথনে সমস্ত কিছু সরানোর একটি সহজ উপায় রয়েছে is আইপিথন কনসোলে কেবল টাইপ করুন:

%reset

তারপরে সিস্টেম আপনাকে জিজ্ঞাসা করতে বলবে। Y চাপুন। আপনি যদি এই প্রম্পটটি দেখতে না চান তবে কেবল টাইপ করুন:

%reset -f

এই কাজ করা উচিত..


1
আবারও, কেন এটি শীর্ষ প্রশ্নের উত্তর নয়?
myradio

11
@myradio কারণ এটা সবাই অপ্রাসঙ্গিক ব্যবহার না IPython , এবং, এটা ত্ত প্রশ্নের উত্তর; প্রশ্নটি জিজ্ঞাসা করে যে কীভাবে গ্লোবাল অবজেক্ট রেফারেন্সগুলি মুছবেন, আইপিথন শেলের সামগ্রী পুনরায় সেট করবেন না ।
অ্যান্ড্রিয়াস

17

আপনি পাইথন আবর্জনা সংগ্রহকারী ব্যবহার করতে পারেন:

import gc
gc.collect()

6
আরে @ ফারদিন! ধন্যবাদ! আপনার উত্তর কাজ করে এবং আমার দিন বাঁচায়! তবে gc.collect () এর আগে আমি ডেল (ভেরিয়েবল) করেছি।
Gmosy Gnaq

9

আপনি যদি ইন্টারেক্টিভ পরিবেশে থাকেন Jupyterবা ipythonআপনার অবাঞ্ছিত ভার সাফ করতে আগ্রহী হতে পারে ভারী হয়ে থাকে তবে আপনি পারেন।

জাদু-কমান্ড reset এবং reset_selectiveমত ইন্টারেক্টিভ পাইথন সেশন উপর vailable হয় ipythonএবংJupyter

1) reset

reset যদি যুক্তি ছাড়াই ডাকা হয় তবে ব্যবহারকারীর দ্বারা নির্ধারিত সমস্ত নাম সরিয়ে নেমস্পেস পুনরায় সেট করে।

inএবং outপ্যারামিটারগুলি নির্দিষ্ট করে যে আপনি ইন / আউট ক্যাশে ফ্লাশ করতে চান কিনা specify ডিরেক্টরি ইতিহাস dhistপ্যারামিটার দিয়ে ফ্লাশ করা হয় ।

reset in out

আর একটি আকর্ষণীয় এটি হ'ল arrayকেবল অদ্ভুত অ্যারেগুলি সরিয়ে দেয়:

reset array

2) পুনঃনির্বাচিত করুন

ব্যবহারকারীর দ্বারা সংজ্ঞায়িত নামগুলি সরিয়ে নেমস্পেস পুনরায় সেট করে। আপনার যদি প্রয়োজন হয় তবে ইনপুট / আউটপুট ইতিহাস চারপাশে ছেড়ে যায়।

পরিষ্কার অ্যারের উদাহরণ:

In [1]: import numpy as np
In [2]: littleArray = np.array([1,2,3,4,5])
In [3]: who_ls
Out[3]: ['littleArray', 'np']
In [4]: reset_selective -f littleArray
In [5]: who_ls
Out[5]: ['np']

সূত্র: http://ipython.readthedocs.io/en/stable/interactive/magics.html


6

এটি আমার পক্ষে কাজ করেছে।

স্থানীয়দের দ্বারা অনুসরণ করা গ্লোবালগুলির জন্য আপনাকে এটি একবারে চালানো দরকার

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

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

4

আসলে পাইথন মেমরির পুনরায় দাবি জানাবে যা আর ব্যবহার হয় না his এটিকে বলা হয় আবর্জনা সংগ্রহ যা পাইথনের স্বয়ংক্রিয় প্রক্রিয়া। তবে এখনও যদি আপনি এটি করতে চান তবে আপনি এটি দ্বারা মুছতে পারেন del variable_name। আপনি ভেরিয়েবলটি বরাদ্দ করে এটিও করতে পারেনNone

a = 10
print a 

del a       
print a      ## throws an error here because it's been deleted already.

অযৌক্তিক পাইথন বস্তু থেকে সত্যিকারের স্মৃতি পুনরুদ্ধারের একমাত্র উপায় হ'ল আবর্জনা সংগ্রহকারী। ডেল কীওয়ার্ডটি কেবল কোনও বস্তু থেকে একটি নাম আবদ্ধ করে, তবে এখনও অবজেক্টটি আবর্জনা সংগ্রহ করা দরকার। আপনি জিসি মডিউলটি ব্যবহার করে আবর্জনা সংগ্রহকারীকে চালিত করতে বাধ্য করতে পারেন তবে এটি প্রায় অবশ্যই একটি অকালিক অনুকূলতা তবে এটির নিজস্ব ঝুঁকি রয়েছে। ব্যবহার delযেহেতু নামগুলো হিসাবে তারা যাহাই হউক না কেন পরিধি বাইরে গিয়ে করবে মুছে দেওয়া হয়েছে, কোন বাস্তব প্রভাব রয়েছে।


প্রকৃতপক্ষে. অবশ্যই, দোভাষীর গ্লোবাল নেমস্পেসের কাজ করার সময় নামগুলি সুযোগের বাইরে চলে যায় না, তবে কী হয়। :) আমি এটা মূল্য উল্লেখ করার যে কি বস্তু যে আবর্জনা সংগ্রহ করা বাস্তবায়ন-নির্ভরশীল দ্বারা ব্যবহৃত মেমরি ঘটবে, কিন্তু অধিকাংশ পাইথন বাস্তবায়নের মধ্যে gc'ed মেমরির নিছক পাইথন পুকুর ফিরে যায়, এটা না ফিরে প্রোগ্রামটি শেষ না হওয়া পর্যন্ত ওএস।
প্রধানমন্ত্রী 2 রিং

@ পিএম 2 রিং এলওএল :) আমিও তাই মনে করি। অজগরকে কোথা থেকে উল্লেখ করবেন?
d-coder

2
দ্রষ্টব্য যে সিপিথনে জিসি কেবলমাত্র রেফারেন্স চক্রটি ভাঙার প্রয়োজন। থাকলে কোনো রেফারেন্স থাকা, একটি বস্তুর হয় মেমরি থেকে Insta-সরানো হয়েছে। সুতরাং del নেই এখানে একটি বাস্তব প্রভাব আছে।
মার্টিজন পিটারস

@ মার্তিজজনপিটার্স, ইন্সটা-মুছে ফেলা হয়েছে? এটি কি প্রযুক্তিগত শব্দ? :)
এরিক সান

2
@ এরিকসুন: হ্যাঁ, অবশ্যই আরএফসি 4042-বিস 2 দ্বারা সংজ্ঞায়িত করা হয়েছে, অবশ্যই! :
মার্টিজন পিটারস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.