2017-12-13 9 views
-3

私は2,3日ほど学校のミッションで立ち往生しています!問題は、元のタプルと異なるIDを持つ新しいタプルにタプルをコピーするように求めます!これは私の現在のコードですが、まだ別のIDでコピーする方法はありません!Pythonタプルからタプルへ

def copy_tree(tree): 
mylist=[] 
for items in tree: 
    mylist.append(items) 
mytuple=tuple(mylist) 
return mytuple 
original = (1, 2, 3, 4) 
+2

あなたのインデントを修正してくださいT2 = T1のようにそれをスライスして別のものに別のタプルから番号を挿入することができ... – DavidG

+1

あなたのコードが正常に動作する必要があります。あなたは "ID"が何を指しているのか知っていますか?また、タプルは不変なので、通常コピーを作成することはあまり意味がありません。 –

+0

[最小限の、完全で検証可能な例を作成する方法](https://stackoverflow.com/help/mcve)を参照してください。 –

答えて

1

Pythonのタプルは不変なので、通常はコピーを作成する必要はありません。これはおそらく理由です。

>>> l = [1,2,3] 
>>> list(l) is l # new list ... 
False 
>>> t = (1,2,3) 
>>> tuple(t) is t # but same tuple 
True 

あなたは、しかし、最初のlistにタプルを変換し、そのリストから新しいtupleを作成することができます与えられたパラメータがすでにタプルの場合listtuple自動的に新しいタプルを作成しないます。

>>> tuple(list(t)) == t # equal ... 
True 
>>> tuple(list(t)) is t # ... but not the same 
False 
>>> id(tuple(list(t))), id(t) # different id 
(139852830618896, 139852830618752) 

これは基本的にあなたが現在行っていることですが、いくつかの行が追加されていますが、コードは実際にうまくいくはずです。


ただし、これはがコピーされていないタプルの浅いコピー、タプル内すなわちオブジェクト(何らかの他のタプル、リストなど)を作成すること。それらをコピーする必要がある場合は、他の回答と同様にcopy.deepcopyを使用してください。しかし、これは、あまりにも、(ネスト)のみタプルならば、それはコピーを作成しないように「スマート」であることは不変の値が含まれています

>>> k = (1, (2, "3"))  # all immutable 
>>> copy.deepcopy(k) is k 
True 
>>> k = (1, (2, "3", [])) # contains mutable list 
>>> copy.deepcopy(k) is k 
False 
+1

最後の段落について: 'k =(1、(2、" 3 "))'を試してから、 'deepcopy(k)is k''を' True'としました。 –

+0

@StefanPochmann正直言って、私はそれを試していないが、あなたは正しい。 'deepcopy'のように見えますが、タプルに可変オブジェクトがある場合にのみコピーします。 –

0
#There is no need to copy immutables. For Academic Purpose: 
from copy import deepcopy 
#initialising first tuple k 
k=(1,2) 
id(k) # checking memory id of k 
j=deepcopy(k) #deepcopying k to j 
id(j) # checking memory id of j 
+0

これは何を表示するはずですか? –

+0

kとjは同じ内容を持っていますが(kはjにコピーされています)、実際には同じメモリ位置を参照していませんが、異なるメモリ位置が割り当てられています。 id(変数)はメモリIDを与えます。 –

+1

多分、違うバージョンのPythonで動作が異なるかもしれませんが、 'deepcopy'は実際にはタプルのコピーを作成しません(そしてその内容はすべて不変です)。 –

0

は本当にあなたが探しているものを知らないが、 :

t1 = (1, 2, 3, 4) 
t2 = t1 

print(t1) 
print(t2) 

ここで、t2は、t1のリテラルコピー/クローンです。

前述のように、タプルは可変ではありません。タプルを別のタプルに追加したい場合は、セパレータとして "、"を使うことができます。

「t2 = t1,1,2,3,4」という数字を追加するだけで、別のタプルでタプルをコピーできます。

または

あなたは[2]、1,2,3-