পাইথনে, "। অ্যাপেন্ড ()" এবং "+ = []" এর মধ্যে পার্থক্য কী?


121

পার্থক্য কি:

some_list1 = []
some_list1.append("something")

এবং

some_list2 = []
some_list2 += ["something"]

3
একক আইটেমের জন্য যোগ করুন। আপনি বলতে চাইছেন extend
হাসেন

এর বেশি আকর্ষণীয় ক্ষেত্রে জন্য +=বনাম extend: stackoverflow.com/questions/3653298/...
সিরো Santilli郝海东冠状病六四事件法轮功

উত্তর:


160

আপনার ক্ষেত্রে পার্থক্য হল পারফরম্যান্স: সংযুক্তি দ্বিগুণ দ্রুত।

Python 3.0 (r30:67507, Dec  3 2008, 20:14:27) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeit
>>> timeit.Timer('s.append("something")', 's = []').timeit()
0.20177424499999999
>>> timeit.Timer('s += ["something"]', 's = []').timeit()
0.41192320500000079

Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import timeit
>>> timeit.Timer('s.append("something")', 's = []').timeit()
0.23079359499999999
>>> timeit.Timer('s += ["something"]', 's = []').timeit()
0.44208112500000141

সাধারণ ক্ষেত্রে appendতালিকায় একটি আইটেম যুক্ত হবে, যখন ডান হাতের পাশের তালিকার সমস্ত উপাদান বাম-হাতের তালিকায় +=অনুলিপি করবে ।

আপডেট: পারফেক্ট বিশ্লেষণ

বাইকোডগুলির সাথে তুলনা করে আমরা ধরে নিতে পারি যে appendসংস্করণটি LOAD_ATTR+ CALL_FUNCTION, এবং + = সংস্করণ - ইন-এর চক্রকে অপচয় করে BUILD_LIST। স্পষ্টতই BUILD_LISTপরাশক্তি LOAD_ATTR+ CALL_FUNCTION

>>> import dis
>>> dis.dis(compile("s = []; s.append('spam')", '', 'exec'))
  1           0 BUILD_LIST               0
              3 STORE_NAME               0 (s)
              6 LOAD_NAME                0 (s)
              9 LOAD_ATTR                1 (append)
             12 LOAD_CONST               0 ('spam')
             15 CALL_FUNCTION            1
             18 POP_TOP
             19 LOAD_CONST               1 (None)
             22 RETURN_VALUE
>>> dis.dis(compile("s = []; s += ['spam']", '', 'exec'))
  1           0 BUILD_LIST               0
              3 STORE_NAME               0 (s)
              6 LOAD_NAME                0 (s)
              9 LOAD_CONST               0 ('spam')
             12 BUILD_LIST               1
             15 INPLACE_ADD
             16 STORE_NAME               0 (s)
             19 LOAD_CONST               1 (None)
             22 RETURN_VALUE

আমরা LOAD_ATTRওভারহেড অপসারণ করে আরও বেশি পারফরম্যান্স উন্নত করতে পারি :

>>> timeit.Timer('a("something")', 's = []; a = s.append').timeit()
0.15924410999923566

12
+1: এটি খুব আকর্ষণীয়। আমি যাইহোক যাইহোক সংযোজন ব্যবহার করি, কারণ এটি পরিষ্কার কোডে ফলাফল করে। তবে আমি বুঝতে পারিনি যে পারফরম্যান্সের পার্থক্য রয়েছে। যদি কিছু হয় তবে আমি আশা করি যে সংযোজনটি ধীর হতে পারে, যেহেতু এটি একটি গ্যারান্টিযুক্ত ফাংশন কল, যখন আমি ধরেছিলাম + + আরও অপ্টিমাইজ করা হবে।
ডিএনএস

2
কার্যকরী পার্থক্যও কি নেই? উদাহরণস্বরূপ একটি = [] , খ = [4,5,6] যাক , এখানে আপনি সি = এ। অ্যাপেন্ড (বি) করেন তবে সি + এর তালিকাতে [[4,5,6]] হবে তবে সি + = খ ; একটি সাধারণ তালিকা c = [4,5,6] এ নিয়ে যাবে
rph

কেবল জিনিসগুলি সোজা করার জন্য: আপনার ইনপুটটি সঠিক ফর্ম্যাটে যতক্ষণ থাকে ততক্ষণ প্রসারিত বা সংযোজনের চেয়ে আরও ভাল পারফরম্যান্স দেয় + বর্তমান উদাহরণে সময় লাগে যা হ'ল ['কিছু'] তালিকা তৈরি করা। + = প্রায় 15% দ্রুত
জো

@Joe আপনি তুলনা করছেন তাহলে appendবনাম +=, তাহলে আপনি আবশ্যক তালিকার সৃষ্টি পরিমাপ অংশ হিসেবে অন্তর্ভুক্ত। অন্যথায় এটি একটি আলাদা প্রশ্ন হতে পারে ( extendবনাম +=)।
জেমসডলিন

@ জেমসডলিন হ্যাঁ! আপনি ইতিমধ্যে এটি না জানলে ভুল হওয়া সহজ। কিছুটা অতিরিক্ত নির্ভুলতা কখনই কাউকে আঘাত করেনি, তাই না?
জো

48

উদাহরণস্বরূপ আপনার দেওয়া, সেখানে কোন পার্থক্য, আউটপুট পদ, মধ্যবর্তী সবকিছুর appendএবং +=। তবে appendএবং +(যা প্রশ্নটি মূলত প্রশ্ন করা হয়েছিল) এর মধ্যে পার্থক্য রয়েছে ।

>>> a = []
>>> id(a)
11814312
>>> a.append("hello")
>>> id(a)
11814312

>>> b = []
>>> id(b)
11828720
>>> c = b + ["hello"]
>>> id(c)
11833752
>>> b += ["hello"]
>>> id(b)
11828720

আপনি দেখতে পাচ্ছেন, appendএবং +=একই ফলাফল রয়েছে; তারা কোনও নতুন তালিকা তৈরি না করে তালিকায় আইটেমটি যুক্ত করে। ব্যবহার +করে দুটি তালিকা যুক্ত হয় এবং একটি নতুন তালিকা তৈরি হয়।


সেখানে হয় পরিশেষে যোগ এবং + = মধ্যে পার্থক্য।
কনস্টান্টিন

3
appendতালিকায় একটি এন্ট্রি যুক্ত করার সত্যতা রয়েছে , অন্যদিকে + = অন্যান্য তালিকায় যেমন রয়েছে তেমনি যুক্ত হয়েছে (যেমন উপাধি আছে extend)। তবে তিনি / সে জানেন যে প্রশ্নটি কীভাবে লিখেছিল তা বিচার করে। আমি মিস করছি অন্য কিছু পার্থক্য আছে?
ডিএনএস

1
একটি পার্থক্য রয়েছে কারণ একটি বর্ধিত অ্যাসাইনমেন্টটি রিবাইন্ডিংয়ের পরিচয় দেয় (আমার উত্তরে ব্যাখ্যা)।
বোবিনস

42
>>> a=[]
>>> a.append([1,2])
>>> a
[[1, 2]]
>>> a=[]
>>> a+=[1,2]
>>> a
[1, 2]

দেখুন যে সংযোজন তালিকাটিতে একটি একক উপাদান যুক্ত করে, যা কিছু হতে পারে। +=[]তালিকায় যোগ দেয় j


2
এটি ভোট দেওয়া কারণ এটি উভয়ের মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য। ভাল কাজ.

31

+ = একটি অ্যাসাইনমেন্ট। আপনি এটি ব্যবহার করার সময় আপনি সত্যিই 'কিছু_লিস্ট 2 = কিছু_লিস্ট 2 + [' কিছু ']' বলছেন। অ্যাসাইনমেন্টগুলিতে রিবন্ডিং জড়িত, সুতরাং:

l= []

def a1(x):
    l.append(x) # works

def a2(x):
    l= l+[x] # assign to l, makes l local
             # so attempt to read l for addition gives UnboundLocalError

def a3(x):
    l+= [x]  # fails for the same reason

+ = অপারেটরকে সাধারণত নতুন তালিকা অবজেক্টের মতো তালিকা + তালিকা তৈরি করতে হবে যা সাধারণত:

>>> l1= []
>>> l2= l1

>>> l1.append('x')
>>> l1 is l2
True

>>> l1= l1+['x']
>>> l1 is l2
False

তবে বাস্তবে:

>>> l2= l1
>>> l1+= ['x']
>>> l1 is l2
True

এর কারণ পাইথন তালিকাগুলির পরিবর্তে একটি + = বাড়ানো অ্যাসাইনমেন্ট শর্ট সার্কিট এবং কল লিস্ট.এক্সটেন্ড () তৈরি করতে __iadd __ () প্রয়োগ করে। (এটি একটি বিস্ময়কর ওয়ার্টের কিছুটা: এটি সাধারণত যা বোঝায় তা করে তবে বিভ্রান্তিকর কারণে))

সাধারণভাবে, আপনি যদি কোনও বিদ্যমান তালিকা সংযোজন / প্রসারিত করেন এবং আপনি একই তালিকার রেফারেন্সটি (একটি নতুন তৈরি করার পরিবর্তে) রাখতে চান, তবে স্পষ্ট হওয়া এবং সংযোজন () / প্রসারিত () এর সাথে লেগে থাকা ভাল best পদ্ধতি।


21
 some_list2 += ["something"]

এটা আসলে

 some_list2.extend(["something"])

একটি মান জন্য, কোন পার্থক্য আছে। ডকুমেন্টেশন বলে যে,

s.append(x) হিসাবে s[len(s):len(s)] = [x]
s.extend(x) একইs[len(s):len(s)] = x

সুতরাং স্পষ্টতই s.append(x)হিসাবে একইs.extend([x])


s.append একটি স্বেচ্ছাসেবী টাইপ নেয় এবং এটি তালিকায় যুক্ত করে; এটি একটি সত্য সংযোজন। s.extend একটি পুনরাবৃত্তিযোগ্য (সাধারণত একটি তালিকা) নেয়, এবং এর মেমরি অ্যাড্রেসগুলি পরিবর্তিত করে পুনরাবৃত্তকারীগুলিকে s এর সাথে যুক্ত করে। এগুলি এক নয়
W4t3randWind 31'18

9

পার্থক্য হল CONCATENATE ফলে তালিকা চেপ্টা হবে, যেহেতু পরিশেষে যোগ মাত্রা অক্ষত রাখা হবে:

সুতরাং উদাহরণস্বরূপ:

myList = [ ]
listA = [1,2,3]
listB = ["a","b","c"]

অ্যাপেন্ড ব্যবহার করে, আপনি তালিকার একটি তালিকা দিয়ে শেষ করবেন:

>> myList.append(listA)
>> myList.append(listB)
>> myList
[[1,2,3],['a',b','c']]

পরিবর্তে সংক্ষিপ্ত ব্যবহার করে, আপনি একটি সমতল তালিকা দিয়ে শেষ করুন:

>> myList += listA + listB
>> myList
[1,2,3,"a","b","c"]

5

এখানে পারফরম্যান্স টেস্টগুলি সঠিক নয়:

  1. আপনার প্রোফাইলটি একবারে চালানো উচিত নয়।
  2. যদি অ্যাপেন্ড বনাম তুলনা করা যায় তবে + = [] কতবার আপনার স্থানীয় ফাংশন হিসাবে অ্যাপেন্ড ঘোষণা করা উচিত।
  3. সময়ের ফলাফলগুলি বিভিন্ন অজগর সংস্করণে পৃথক: 64 এবং 32 বিট

যেমন

টাইমিট.টাইমারের ('আমি এক্সরেঞ্জে (100): অ্যাপ (আই)', 'এস = []; অ্যাপ্লিকেশন = এস.পেন্ড' ') সময়কাল ()

ভাল পরীক্ষাগুলি এখানে পাওয়া যাবে: http://markandclick.com/1/post/2012/01/python-list-append-vs.html


এখনও, সেই পৃষ্ঠায় + = পরীক্ষাগুলি ব্যবহার করে += [one_var]। যদি আমরা তালিকা তৈরি করা বাদ দিই, + = দ্রুত বিকল্প হয়।
জো

3

অন্যান্য উত্তরে বর্ণিত দিকগুলি ছাড়াও, আপনি তালিকার একটি তালিকা তৈরি করার চেষ্টা করার সময় সংযোজন এবং + [] এর খুব আলাদা আচরণ থাকে।

>>> list1=[[1,2],[3,4]]
>>> list2=[5,6]
>>> list3=list1+list2
>>> list3
[[1, 2], [3, 4], 5, 6]
>>> list1.append(list2)
>>> list1
[[1, 2], [3, 4], [5, 6]]

list1 + ['5', '6'] স্বতন্ত্র উপাদান হিসাবে তালিকা 5 এ '5' এবং '6' যুক্ত করে। list1.append (['5', '6']) তালিকাটিকে ['5', '6'] যোগ করে একটি একক উপাদান হিসাবে to


2

অন্যান্য উত্তরে উল্লিখিত রিবন্ডিং আচরণটি নির্দিষ্ট পরিস্থিতিতে গুরুত্বপূর্ণ:

>>> a = ([],[])
>>> a[0].append(1)
>>> a
([1], [])
>>> a[1] += [1]
Traceback (most recent call last):
  File "<interactive input>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

এর কারণ কারণ বর্ধিত অ্যাসাইনমেন্টটি সর্বদা পুনঃতফসিল করে, এমনকি যদি বস্তুটি জায়গায় জায়গায় পরিবর্তিত হয়। এখানে রিব্যান্ডিংটি ঘটে a[1] = *mutated list*যা টিপলসের জন্য কাজ করে না।


0

প্রথমে একটি উদাহরণ নেওয়া যাক

list1=[1,2,3,4]
list2=list1     (that means they points to same object)

if we do 
list1=list1+[5]    it will create a new object of list
print(list1)       output [1,2,3,4,5] 
print(list2)       output [1,2,3,4]

but if we append  then 
list1.append(5)     no new object of list created
print(list1)       output [1,2,3,4,5] 
print(list2)       output [1,2,3,4,5]

extend(list) also do the same work as append it just append a list instead of a 
single variable 

0

সংযোজন () পদ্ধতি বিদ্যমান তালিকায় একটি আইটেম যুক্ত করে

some_list1 = []
some_list1.append("something")

সুতরাং এখানে কিছু_লিস্ট 1 সংশোধিত হবে।

আপডেট করা হয়েছে:

যেখানে বিদ্যমান ব্যবহারের তালিকার তালিকার উপাদানগুলি (একাধিক উপাদান) একত্রিত করার জন্য প্রসারিত ( ফ্লাক্স দ্বারা সংশোধন করা হয়েছে ) এর অনুরূপ ।

some_list2 = []
some_list2 += ["something"]

সুতরাং এখানে কিছু_লিস্ট 2 এবং ["কিছু"] হল দুটি তালিকা যা মিলিত।


1
এটা ভুল. +=একটি নতুন তালিকা ফিরে না। প্রোগ্রামিং প্রায়শই জিজ্ঞাসিত প্রশ্নাবলী বলেছেন: "... তালিকার জন্য, __iadd__কলিং সমতূল্য extendতালিকা এবং তালিকা ফেরার এর কেন আমরা বলতে যে তালিকার জন্য। +=একটি হল" "এর জন্য সাধারণভাবে সংক্ষেপে list.extend"। আপনি সিপিথন উত্স কোডে এটি নিজের জন্যও দেখতে পাবেন: github.com/python/cpython/blob/v3.8.2/Objects/…
ফ্লাক্স

0

"+" তালিকাটি পরিবর্তন করে না

.append () পুরানো তালিকার পরিবর্তন করে

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