2017-12-13 16 views
-3

나는 며칠 쯤 내 학교 임무에 갇히게된다! 이 질문은 원래 튜플과 다른 ID를 가진 새로운 튜플에 튜플을 복사 해달라고 요청합니다! 이것은 현재 코드이지만 여전히 다른 ID로 복사하는 방법을 얻을 수 없습니다!파이썬 튜플에서 튜플로

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

파이썬의 튜플은 변경할 수 없으므로 일반적으로 복사본을 만들 필요가 없습니다. 아마도 그 이유가 될 수 있습니다.

>>> 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

아마도 파이썬 버전마다 동작이 다르지만 실제로'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