2016-12-28 6 views
-2

私はPythonにいくつか問題があります。私はあなたがしていることは他の言語でもわかりやすく、非常に論理的であることを知っています。しかし、Pythonでは、appending a listdataから新しいlistへと単純にが参照またはポインタを保持し、その結果、元のリストに加えられた変更は新しいリストで明らかになります。ポインタや参照なしでリストを追加する

私はcopy.copy(list[:])について聞いたことがありますが、これはうまくいくとは100%確信していません。あなたは list_1 を変更する場合、彼らは同じリストを指しているので

list_1 = [1, 2, 3] 
new_list = [] 
new_list.append(list_1[:]) 

しかし、あなたはまた、new_listを変更します。

>>> list_1.append(4) 

>>> print list_1 
[1, 2, 3, 4] 

>>> print new_list 
[1, 2, 3, 4] 

これはすべて私にとって迷惑です。誰かがより良い方法を知っているなら、教えてください。

私はこのようなnew_list埋めるように私は、list_1に変更を加えるとnew_listappendに続けることができるようにしたい:

new_list 
[0] >>> 
    [1, 2, 3, 4] 
[1] >>> 
    [5, 6, 7, 8] 

そして、時には最初のリストをこの例で請求されているものよりも大きくなる可能性があります。

Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (Intel)] on win32 
Type "copyright", "credits" or "license()" for more information. 
>>> list_1 = [1,2,3] 
>>> new_list = [] 
>>> new_list.append(list_1[:]) 
>>> print new_list 
SyntaxError: Missing parentheses in call to 'print' 
>>> print(new_list) 
[[1, 2, 3]] 
>>> list_1.append(4) 
>>> print(new_list) 
[[1, 2, 3]] 
>>> print(new_list) 
[[1, 2, 3]] 
>>> print(list_1) 
[1, 2, 3, 4] 

ストレンジ:

は現在、テストランを行いました。奇妙な。奇妙な。

+0

'new_list.append(list_1の[:])' => 'new_list = [[1、2、3]]'。 '[:]' _はコピーを作成するので、私はあなたの質問を理解していません。私たちは[mcve]が必要です –

+0

なぜnew_listにネストされたリストを取得できませんでしたか?このコードは正しく理解していれば動作します。 – martianwars

+0

@ Jean-FrançoisFabre、このコードにはMCVがあります。自分のコード例を参照してください。 – haxxir411

答えて

-2

Pythonでは、複雑なオブジェクトは常にその参照によって表されます。複合体とは、bool,int,float,NoneTypeおよび他の基本データ型を意味しない。これは、なぜ、2つの参照が一つのオブジェクトを指し示すことができ、一つの参照を使用して、任意の変更が他の参照throught示す同じ変更につながるです:

>>> lst = [1, 2] 
>>> lst2 = lst 
>>> lst.append(3) 
>>> lst2 
[1, 2, 3] 

あなたは2つの異なるオブジェクトを持っているしたい場合は、最初のクローンを作成する必要があります1。それはあなたが実際に必要とするものに応じてcopy.copyまたはcopy.deepcopyによって行うことができます。

>>> import copy 
>>> lst = [1, 2] 
>>> lst2 = copy.copy(lst) 
>>> lst.append(3) 
>>> lst 
[1, 2, 3] 
>>> lst2 
[1, 2] 
+1

何ですか? Pythonでは、bool、int、floatなどの基本的なデータ型さえも本格的なオブジェクトです。したがって、 'a = 42'を実行すると、42の値を持つ' int'オブジェクトを名前 "a"にバインドします。本質的に、「a」は、「int」オブジェクトへのポインタに関連するキーである。しかし、私はポインタ、リファレンスなどの面でPythonについて考えるのは最善の方法ではありません。Pythonのデータモデルをそれ自身の言葉で取り入れようとします。 –

+0

@ PM2Ring私はそれを知っています。そして私の説明はあなたに矛盾しない。私は簡単な言葉でそれを説明する方法を試していました。私の説明はかなり理解できて、作者を助けるかもしれないと思います。 – Fomalhaut

+0

@Fomalhaut 1. "参照"という用語は、他の言語ではっきりと定義された意味を持ち、Pythonの仕組みとは一致せず、2/Pythonバインディングは__all__型に対しても同じ働きをします - 組み込みであってもなくても、 __all__オブジェクト、期間です。 –

関連する問題