পাইথন অ্যাপেন্ড () বনাম + তালিকাগুলিতে অপারেটর, কেন এগুলি বিভিন্ন ফলাফল দেয়?


113

কেন এই দুটি ক্রিয়াকলাপ ( append()শ্রদ্ধা +) বিভিন্ন ফলাফল দেয়?

>>> c = [1, 2, 3]
>>> c
[1, 2, 3]
>>> c += c
>>> c
[1, 2, 3, 1, 2, 3]
>>> c = [1, 2, 3]
>>> c.append(c)
>>> c
[1, 2, 3, [...]]
>>> 

শেষ ক্ষেত্রে আসলে একটি অসীম পুনরাবৃত্তি। c[-1]এবং cএকই। +অপারেশনের সাথে এটি আলাদা কেন ?


1
একটি কার্যক্ষম নতুন প্রশ্নের প্রতি যথাযথ সম্মানের সাথে: আমি এটিকে পরিষ্কার রাখতে মূল প্রশ্নে ফিরে এসেছি (থ্রেডের প্রতি 1 টি প্রশ্ন, এসএএফএএ দেখুন)। দয়া করে একটি নতুন জিজ্ঞাসা করুন বা প্রতিটি উত্তরের নীচে মন্তব্য-থ্রেডের মধ্যে ফলোআপ প্রশ্ন জিজ্ঞাসা করুন। দ্রষ্টব্য: আপনার সম্পাদনাগুলি হারিয়ে যায় না, ইতিহাস ক্লিক করুন এবং আপনি এটি একটি নতুন প্রশ্নে অনুলিপি / আটকানোতে পারেন।
আবেল


দেখে মনে হচ্ছে এটি বিভিন্ন উত্তর দেয় তবে এর মতো নয়। আপনি যদি + অপারেটর ব্যবহার করে কোনও মান যুক্ত করতে চান তবে আপনার o ব্যবহার সাইন আছে। c + = [c] আপনাকে সংযোজন হিসাবে একই ফল দেবে।
শরীফ চৌধুরী

@ শরীফচৌধুরী আমি বিশ্বাস করি আপনিও একই ফল পাবেন
বিশ্বাসী

উত্তর:


142

"কেন" ব্যাখ্যা করতে:

+অপারেশন যোগ অ্যারের মূল অ্যারেতে উপাদান। array.appendঅপারেশন অ্যারে (অথবা কোন বস্তুর) মূল অ্যারের শেষ, পাত্রে ঢোকানো যা ফলাফল স্ব রেফারেন্স যে স্পট (অত: পর অসীম recursion) এ।

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

একটি বিকল্প

ব্যবহার করুন extend()আপনি (অন্যদের এখানে পাশাপাশি দেখানো হয়েছে) একটি ফাংশন যা + অপারেটর অনুরূপ কাজ করে ব্যবহার করতে চান। বিপরীতটি করা বুদ্ধিমানের কাজ নয়: তালিকার জন্য + অপারেটরের সাথে সংযুক্ত করার চেষ্টা করা ( কেন আমার পূর্ববর্তী লিঙ্কটি দেখুন )।

ছোট্ট ইতিহাস

মজা করার জন্য, একটি সামান্য ইতিহাস: 1993 সালের ফেব্রুয়ারিতে পাইথনে অ্যারে মডিউলটির জন্ম it এটি আপনাকে অবাক করে দিতে পারে তবে ক্রমগুলি এবং তালিকাগুলি অস্তিত্বে আসার পরে অ্যারেগুলি যুক্ত করা হয়েছিল।


2
+1 কারণ আমি সর্বদা সঠিক তথ্যকে upvote করি। অফিসিয়াল ডক্সের লিঙ্কগুলি সর্বদা একটি প্লাস!
jathanism

10
"কেন" এর আরেকটি অংশ: বুদ্ধিমান লোকেরা +প্রতিসম: প্রত্যাশিত তালিকা প্রত্যাশা করে।
বেনি চেরনিয়াভস্কি-পাসকিন

1
+1, গুড পয়েন্ট বেনি (যদিও আমি এটি "বুদ্ধিমান" হিসাবে "rh পার্শ্বের অবজেক্টটি এলএইচ পাশের অ্যারেতে সংযুক্ত করা হয়েছে" হিসাবে বিবেচনা করতে পারি, তবে ব্যক্তিগতভাবে বর্তমান আচরণটি আরও সংবেদনশীল বলে মনে করি)।
হাবেল

যদি কোনও উপাদান একক স্ট্রিং হয়, যেমন s = 'শব্দ', l = ['এটি', 'হয়']। তারপরে l.append (গুলি) এবং l + s একই হওয়া উচিত। আমি কি সঠিক?
ব্যবহারকারী 3512680

23

কনক্যাটেনশন অপারেটর +একটি বাইনারি ইনফিক্স অপারেটর যা তালিকাগুলিতে প্রয়োগ করা হলে, তার দুটি অপারেশনের প্রতিটি উপাদানগুলির একটি নতুন তালিকা প্রদান করে। list.append()পদ্ধতি হল mutatorউপরlist যা তার একক appends object(আপনার নির্দিষ্ট উদাহরণ তালিকায় যুক্তি cবিষয়) list। আপনার উদাহরণে এটি cনিজের কাছে একটি রেফারেন্স সংযোজন করে (যার ফলে অসীম পুনরাবৃত্তি)।

'+' কনটেনটেশনের বিকল্প

list.extend()পদ্ধতি একটি mutator পদ্ধতি যা তার concatenates হয় sequenceবিষয় সঙ্গে যুক্তি list। বিশেষত, এটি sequenceপুনরাবৃত্তি ক্রমের প্রতিটি উপাদানকে সংযুক্ত করে ।

একপাশে

অপারেটর +হওয়ায় অভিব্যক্তির ফলাফলটিকে একটি নতুন মান হিসাবে প্রত্যাবর্তন করে। চেইনবিহীন mutatorপদ্ধতি list.extend()হওয়ায় বিষয় তালিকা তালিকাসমূহে পরিবর্তিত হয় এবং কিছুই দেয় না।

অ্যারেগুলির

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

থেকে অ্যারের ডক্স :

অ্যারেগুলি সিক্যুয়েন্স টাইপ এবং তালিকার মতো খুব আচরণ করে, তাদের মধ্যে সঞ্চিত বস্তুর প্রকারটি সীমাবদ্ধ না করে। ধরণের কোডটি টাইপ কোড ব্যবহার করে অবজেক্ট তৈরির সময় নির্দিষ্ট করা হয় যা একক অক্ষর।


18

appendএকটি তালিকায় একটি উপাদান সংযোজন করা হয়। আপনি যদি নতুন তালিকা ব্যবহার করতে চান তবে সেই তালিকাটি প্রসারিত করতে চান extend

>>> c = [1, 2, 3]
>>> c.extend(c)
>>> c
[1, 2, 3, 1, 2, 3]

4
আমি ভেবেছিলাম ফলাফলগুলি কেন সম্পূর্ণ তা স্পষ্ট , কারণ অপারেশনগুলি একই নয়! যদি এটি প্রদর্শিত হয় +এবং extendবিভিন্ন ফলাফল আসে যা আমাদের কিছু ভাবার আছে।
সাইলেন্টগোস্ট

1
+1: আমি কেন "কেন" প্রশ্নগুলি অপছন্দ করি: appendএবং +পৃথক। এই জন্য. আমি এই উত্তরটি পছন্দ করি কারণ এমন কি প্রস্তাব দেয় যা আরও বুদ্ধিমান হয়।
এস .লট

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

আরও বিক্ষোভের জন্য, সম্ভবত প্রদর্শন c += [c]এবং c.append(c[:])খুব।
প্রথমত

2
@ আবেল: কেন a+b != a*b? তারা বিভিন্ন অপারেশন। এটাই উত্তর। "আমি" কীভাবে সঠিকভাবে যুক্ত করতে পারি? "এর মতো অন্যান্য প্রশ্নের মতো" কেন "সহায়ক নয়? বা "এই সংযোজনে অসীম পুনরাবৃত্তির দিকে পরিচালিত করে তাতে কী ভুল?" "আমি এক্সকে কী করব" বা "আমি এক্স করলে কী ভুল হয়েছিল" ফর্মের প্রশ্নগুলি? অথবা "এক্স এর পরিবর্তে আমার কী করা উচিত" কাউকে শিখতে সহায়তা করবে, তবে কেন্দ্রীভূত, ব্যবহারযোগ্য, কার্যক্ষম উত্তরগুলি সরবরাহ করবে।
এস .লট

8

পাইথন তালিকাগুলি ভিন্নধর্মী যে একই তালিকার উপাদানগুলি যে কোনও ধরণের অবজেক্ট হতে পারে। অভিব্যক্তি: c.append(c)বস্তুর cতালিকায় এটি কখনই হতে পারে সংযোজন করে । ক্ষেত্রে এটি তালিকাটিকে নিজেই তালিকার একটি সদস্য করে তোলে।

এক্সপ্রেশন c += cদুটি তালিকাকে একসাথে যুক্ত করে এবং ফলটি ভেরিয়েবলের জন্য বরাদ্দ করে c। অতিরিক্ত +তালিকাভুক্ত অপারেটর একটি নতুন তালিকা তৈরি করতে তালিকায় সংজ্ঞায়িত করা হয় যার লিখিত সামগ্রীগুলি প্রথম তালিকার উপাদান এবং দ্বিতীয় তালিকার উপাদানগুলি।

সুতরাং এগুলি হ'ল ডিজাইন দ্বারা বিভিন্ন জিনিস করতে ব্যবহৃত সত্যই এক্সপ্রেশন।


7

আপনি যে পদ্ধতিটি সন্ধান করছেন তা হ'ল extend()। পাইথন ডকুমেন্টেশন থেকে :

list.append(x)
    Add an item to the end of the list; equivalent to a[len(a):] = [x].

list.extend(L)
    Extend the list by appending all the items in the given list; equivalent to a[len(a):] = L.

list.insert(i, x)
    Insert an item at a given position. The first argument is the index of the element before which to insert, so a.insert(0, x) inserts at the front of the list, and a.insert(len(a), x) is equivalent to a.append(x).


2

ডকুমেন্টেশন দেখুন :

list.append (x) এর

  • তালিকার শেষে একটি আইটেম যুক্ত করুন; একটি [লেন (ক) এর সমান:] = [এক্স]।

list.extend (L) - প্রদত্ত তালিকার সমস্ত আইটেম যুক্ত করে তালিকাটি প্রসারিত করুন; a এর সমতুল্য [লেন (ক):] = এল।

c.append(c)উপাদান হিসাবে নিজেকে সিতে "সংযোজন" করে । যেহেতু একটি তালিকা একটি রেফারেন্স টাইপ, এটি একটি পুনরাবৃত্ত তথ্য কাঠামো তৈরি করে।

c += cসমান extend(c), যা সি থেকে সি এর উপাদানগুলিকে সংযোজন করে

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