পাইথনে কোনও মান নির্ধারণ না করে কেবল কোনও পরিবর্তনশীল ঘোষণা করা সম্ভব?


288

পাইথনের ক্ষেত্রেও কি ভেরিয়েবল ঘোষণা করা সম্ভব ?:

var

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

সম্পাদনা: আমি এই জাতীয় ক্ষেত্রে এটি করতে চাই:

value

for index in sequence:

   if value == None and conditionMet:
       value = index
       break

প্রতিলিপি

সম্পর্কিত


1
একটি ছোট প্রোগ্রাম পোস্ট করতে পারে যা এর কারণ হয়ে থাকে please
প্রীত সংঘ

আপনি একটি সদৃশ প্রশ্ন পোস্ট করেছেন, অন্যটির পক্ষে এই প্রশ্নটি বন্ধ করতে ভোট দিয়েছেন।
জেরুব

এখনও কিছু পার্থক্য আছে, এই একটি কেবল ঘোষণা করে কোনও ভেরিয়েবল ব্যবহার করতে সক্ষম না করার সাথে আলোচনা করে।
জোয়ান ওয়েঙ্গ

আপনার প্রথম প্রশ্নটি ব্যাখ্যা করার সাথে পাইথন জগতে ভেরিয়েবল ঘোষণা করার মতো সত্যিকারের কোনও জিনিস নেই।
হারলে হলক্বে

1
কেন কেউ কখনও 'কেবলমাত্র তাকে বরাদ্দ করুন' বলেননি কারণ ভেরিয়েবলগুলি পিরিয়ডে নির্ধারিত হওয়ার আগে তার অস্তিত্ব নেই। এবং পাইথনের ভেরিয়েবলগুলিতে প্রকারের তথ্য থাকে না। বিষয়গুলি তা করে। ভেরিয়েবলগুলি কেবলমাত্র সেই সময়ে অবজেক্টটি ধরে রাখার জন্য। তদ্ব্যতীত, উপরের প্রোগ্রামটি প্রথম লাইনে একটি নামেরর ব্যতিক্রম ছুঁড়ে ফেলা উচিত। (আমি কী 2.X এবং 3.X উভয়ই পাই)
ওসিরিগোথর

উত্তর:


359

কেন শুধু এটি করবেন না:

var = None

পাইথন গতিশীল, তাই আপনাকে জিনিসগুলি প্রকাশ করার দরকার নেই; তারা নির্ধারিত প্রথম স্কোপে স্বয়ংক্রিয়ভাবে উপস্থিত হয়। সুতরাং, আপনার কেবলমাত্র উপরের মত নিয়মিত পুরানো অ্যাসাইনমেন্ট বিবৃতি is

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


1
আমি এটি করতে যাচ্ছিলাম, কিন্তু কেবল স্পষ্টভাবে চিন্তা করেছিলাম এটি এটি করবে।
জোয়ান ওয়েঙ্গেজ

7
বিষয়টি স্পষ্ট করার জন্য, অন্তর্নিহিত নয়। প্রাথমিক মান কী তা অনুমান করা যায় না। কোনও অনির্ধারিত ভেরিয়েবল ব্যতিক্রম ছুঁড়ে ফেলেছে বা যাদুতে কার্যকর মূল্য আছে কিনা তা অবাক হওয়ার কিছু নেই।
এস .লট

2
এটির সাথে আমার কেবল সমস্যাটি ছিল আমি কাউন্টার (মিনিভ্যালু) ট্র্যাক করে যাচ্ছিলাম এবং যে কোনও সময় এর চেয়ে কম মান থাকলে আমি এটিকে নতুন মিনিভ্যালুতে সেট করেছিলাম। যদি আমি মিনিভ্যালুকে মূলত কোনও হিসাবে ঘোষণা না করে, তবে সম্ভবত আমি এটির তুলনায় এটি যে কোনও সংখ্যার চেয়ে কম। আমি সিস.ম্যাকসিন্টে এটি শুরু করে দিয়েছিলাম
টিজে বিডল

... তারা নির্ধারিত প্রথম স্কোপে স্বয়ংক্রিয়ভাবে উপস্থিত থাকে। সুতরাং, আপনাকে প্রথম অ্যাসাইনমেন্টটি সন্ধান করতে হবে এবং এটি বের করতে হবে। ইসস!
এড রান্ডাল

56

আমি আন্তরিকভাবে প্রস্তাব দিচ্ছি যে আপনি অন্যান্য ভাষায় "ভেরিয়েবল" পড়ুন (আমি এটি সম্পর্কিত লিঙ্ক হিসাবে যুক্ত করেছি) - দুই মিনিটের মধ্যে আপনি জানতে পারবেন পাইথনের "নাম" রয়েছে, "ভেরিয়েবল" নয়।

val = None
# ...
if val is None:
   val = any_object

আপনি val = val or any_objectএটি সূচনা করতে লিখতে পারেন।
জুলটান

1
@ জোল্টন: ভ্যালারের কোনও বৈধ মান "মিথ্যা" উদাহরণস্বরূপ, শূন্য বা খালি থাকলে এটি ভেঙে যায়। isমান আছে কিনা তা পরীক্ষা করতে ব্যবহার করুন None
jfs

সরবরাহকৃত লিঙ্কটিতে নিবন্ধটি পড়ার পরে এটি শব্দার্থক পরিশীলনের চেয়ে কিছুটা বেশি বলে মনে হচ্ছে।
অ্যান্ড্রু পি।

29

পাইথন ৩.6+ তে আপনি এর জন্য ভেরিয়েবল টিকা ব্যবহার করতে পারেন:

https://www.python.org/dev/peps/pep-0526/#abstract

পিইপি 484 প্রকারের প্রকারের ইঙ্গিতগুলি, ওরফে প্রকারের টীকাগুলি প্রবর্তিত। যদিও এর মূল ফোকাসটি ফাংশন টীকাগুলি ছিল, এটি ভেরিয়েবলগুলি বর্নিত করতে টাইপ মন্তব্যের ধারণাটিও চালু করেছিল:

# 'captain' is a string (Note: initial value is a problem)
captain = ...  # type: str

পিইপি 526 এর লক্ষ্য পরিবর্তনের পরিবর্তে (বর্গ ভেরিয়েবল এবং উদাহরণ ভেরিয়েবল সহ) বিভিন্ন ধরণের টীকাগুলির জন্য পাইথনে সিনট্যাক্স যুক্ত করা:

captain: str  # Note: no initial value!

আপনি যা জিজ্ঞাসা করেছিলেন তার সাথে এটি আরও সরাসরি মিলিত বলে মনে হচ্ছে "পাইথনের কোনও মান নির্ধারণ না করে কেবলমাত্র কোনও ভেরিয়েবল ঘোষণা করা সম্ভব?"


2
দুর্দান্ত উত্তর
বেন

16

আপনি কী করতে চাইছেন তা আমি নিশ্চিত নই। পাইথন একটি খুব গতিময় ভাষা; আপনি সাধারণত ভেরিয়েবলগুলি ঘোষণার প্রয়োজন হয় না যতক্ষণ না আপনি প্রকৃত অর্পণ করতে বা সেগুলি ব্যবহার করতে যাচ্ছেন। আমার মনে হয় আপনি যা করতে চান তা ঠিক

foo = None

যা Noneভেরিয়েবলের মান নির্ধারণ করবে foo

সম্পাদনা করুন: আপনি কি সত্যিই কাজ করতে চান বলে মনে হচ্ছে শুধু এই হল:

#note how I don't do *anything* with value here
#we can just start using it right inside the loop

for index in sequence:
   if conditionMet:
       value = index
       break

try:
    doSomething(value)
except NameError:
    print "Didn't find anything"

এ জাতীয় সংক্ষিপ্ত কোড উদাহরণ থেকে সত্যই যদি সঠিক স্টাইলটি ব্যবহার করা যায় তবে এটি বলা একটু কঠিন তবে এটি কাজ করার আরও একটি "পাইথোনিক" উপায়।

সম্পাদনা: নীচে জেএফএস দ্বারা মন্তব্য করা হয়েছে (কোডটি দেখানোর জন্য এখানে পোস্ট করা হয়েছে)

ওপির প্রশ্নের সাথে সম্পর্কিত নয় তবে উপরের কোডটি আবার লিখিতভাবে লেখা যেতে পারে:

for item in sequence:
    if some_condition(item): 
       found = True
       break
else: # no break or len(sequence) == 0
    found = False

if found:
   do_something(item)

দ্রষ্টব্য: যদি some_condition()ব্যতিক্রম উত্থাপিত হয় তবে foundআনবাউন্ড হয়।
দ্রষ্টব্য: যদি লেন (ক্রম) == 0 হয়item আনবাউন্ড হয়।

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

for item in sequence:
    if some_condition(item):
       do_something(item)
       break

অথবা

found = False
for item in sequence:
    if some_condition(item):
       found = True
       break

if found:
   do_something(item)

একটি গতিশীল ভাষা এবং খুব গতিশীল ভাষার মধ্যে কি পার্থক্য রয়েছে?
গ্যাভিন মিলার

প্রোগ্রামিং ভাষার টাইপিংয়ের বিভিন্ন অক্ষগুলি ব্যাখ্যা করার একটি দুর্দান্ত নিবন্ধ রয়েছে এবং তারা কীভাবে ধারাবাহিক হয়, বুলিয়ান মানগুলি নয়; দুর্ভাগ্যবশত আমি যে নিবন্ধ আবার জানতে পারেন যখন আমি cite করতে চান :( আমি পাইথন বিবেচনা "খুব গতিশীল" কারণ এটা একাধিক অক্ষ এর পর্যন্ত শেষ আছে।
kquinn

3

আমি সাধারণত ভেরিয়েবলটিকে এমন কিছুতে সূচনা করি যা টাইপটিকে বোঝায়

var = ""

অথবা

var = 0

যদি এটি কোনও অবজেক্ট হতে চলেছে তবে আপনি এটি ইনস্ট্যান্ট না করা পর্যন্ত এটি আরম্ভ করবেন না:

var = Var()

3

ঠিক আছে, যদি আপনি কোনও ভেরিয়েবল সংজ্ঞায়িত করা হয় কিনা তা যাচাই করতে চান তবে কেন এটি স্থানীয় () বা গ্লোবাল () অ্যারেগুলিতে আছে কিনা তা যাচাই করবেন না? আপনার কোডটি পুনরায় লিখিত:

for index in sequence:
   if 'value' not in globals() and conditionMet:
       value = index
       break

যদি এটি স্থানীয় পরিবর্তনশীল হয় তবে আপনি গ্লোবালগুলি () স্থানীয়দের সাথে প্রতিস্থাপন করুন ())


2

প্রথমত, আপনি যে প্রশ্নটি করেছেন তা সম্পর্কে আমার প্রতিক্রিয়া origin

প্রশ্ন: আমার কোডের একটি বিন্দুতে একটি ভেরিয়েবল সংজ্ঞায়িত করা হলে আমি কীভাবে আবিষ্কার করব?

উত্তর: সোর্স ফাইলে পড়ুন যতক্ষণ না আপনি এমন কোনও লাইন দেখতে পান যেখানে সেই পরিবর্তনশীলটি সংজ্ঞায়িত করা হয়।

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

def findFirstMatch(sequence):
    for value in sequence:
        if matchCondition(value):
            return value

    raise LookupError("Could not find match in sequence")

স্পষ্টতই এই উদাহরণে আপনি এর raiseসাথে প্রতিস্থাপন করতে পারেনreturn None কি আপনি অর্জন করতে চেয়েছিলেন উপর নির্ভর করে।

আপনি যদি শর্তের সাথে মেলে এমন সমস্ত কিছু চান তবে আপনি এটি করতে পারেন:

def findAllMatches(sequence):
    matches = []
    for value in sequence:
        if matchCondition(value):
            matches.append(value)

    return matches

এটি করার আরও একটি উপায় রয়েছে yield যা আমি আপনাকে দেখাতে বিরক্ত করব না কারণ এটি যেভাবে কাজ করে এটি বেশ জটিল।

আরও, এটি অর্জনের একটি লাইন উপায় রয়েছে:

all_matches = [value for value in sequence if matchCondition(value)]

2

আমি যদি আপনার উদাহরণটি সঠিকভাবে বুঝতে পারি তবে আপনার যদি বিবৃতিতে যাই হোক না কেন 'মান' উল্লেখ করার দরকার নেই। যে কোনও কিছুতে সেট করার সাথে সাথে আপনি লুপটি ভেঙে ফেলছেন।

value = None
for index in sequence:
   doSomethingHere
   if conditionMet:
       value = index
       break 

1

দেখে মনে হচ্ছে আপনি পাইথনে সি লেখার চেষ্টা করছেন। আপনি যদি সিক্যুয়েন্সে কিছু সন্ধান করতে চান তবে পাইথন এটির মতো কার্য সম্পাদন করেছে like

value = sequence.index(blarg)

1

এটি একটি ভাল প্রশ্ন এবং দুর্ভাগ্যক্রমে খারাপ উত্তর হিসাবে var = Noneইতিমধ্যে একটি মান নির্ধারণ করা হয়েছে, এবং যদি আপনার স্ক্রিপ্ট একাধিকবার চলতে থাকে তবে Noneপ্রতিবারের সাথে এটি ওভাররাইট করা হয় ।

এটি অ্যাসাইনমেন্ট ব্যতীত সংজ্ঞায়িত করার মতো নয়। আমি এখনও এই বিষয়টিকে কীভাবে বাইপাস করব তা বোঝার চেষ্টা করছি।


1

পাইথনে কোনও ভেরিয়েবল ঘোষণা করা সম্ভব (var = কিছুই নয়):

def decl_var(var=None):
if var is None:
    var = []
var.append(1)
return var

0
var_str = str()
var_int = int()

দুষ্টু দুষ্টু দুষ্টু মানুষ! ভেরিয়েবলগুলি প্রকারের সাথে সংযুক্ত করে না, বস্তুগুলি করে। var_str এর মতো জেনেরিক নামে বাধা দেওয়া উচিত নয়। আপনি যদি এটি করতে যাচ্ছেন তবে উদাহরণস্বরূপ 'var_age' বা 'var_name' এর মতো অর্থবহ করুন। এই জাতীয় মানগুলি পূর্ণসংখ্যা বা স্ট্রিং বা যা আপনি চান হিসাবে গ্রহণ করা যেতে পারে এবং অবজেক্টে পরিবর্তিত হতে পারে, যা অজগরকে অন্যান্য ভাষার চেয়ে আলাদা করে তোলে of তারা বলছেন যদি আপনি নিজেকে সারাক্ষণ এটি করার প্রয়োজন মনে করেন তবে আপনি সম্ভবত অন্য কোনও ভাষা ব্যবহার করতে চান।
Osirisgothra

0

যদি Noneকোনও বৈধ ডেটা মান হয় তবে আপনার অন্যভাবে চলকটি নেওয়া দরকার। আপনি ব্যবহার করতে পারেন:

var = object()

এই সেন্ডিনেলটি নিক কোগলান পরামর্শ দিয়েছেন ।


0

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

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