2013-07-18 7 views
0

의 얕은 사본 인 경우 테스트하는 함수를 작성, 나는이 한 : 그러나파이썬 : 목록 1은 lst1이 lst2의 얕은 사본 인 경우 테스트하려면리스트 2

def check_shallow_copy(lst1, lst2): 
''' Return True if lst1 is a shallow copy of lst2. 
Return False if not. 
''' 

for idx in range(len(lst1)): 

    if lst1 == lst2 and id(lst1[idx]) == id(lst2[idx]) and lst1 is not lst2: 
     return True 
    else: 
     return False 

을, 나는이 일 것이라고 생각하지 않습니다 두리스트가 첫 번째 요소의 사본을 공유하지만 다른 요소는 복사하지 않는 경우 id (lst1 [idx])가 모든 인덱스에 대해 id (lst2 [idx])와 같아야하는 함수를 어떻게 변경합니까?

또한 저는 여전히 얕은 사본과 깊은 사본의 차이점에 약간 흐립니다. 이 함수가 lst1이 lst2의 전체 복사본인지 테스트하기를 원한다면 어떤 수정을해야합니까?

감사합니다.

답변

1

gnibbler가 한 일을 조금 설명해 드리겠습니다.

def check_shallow_copy(lst1, lst2): 
    return lst1 is not lst2 and 
      all([x is y for x, y in zip(lst1, lst2)]) 

압축 함수는 튜플들의 목록 (ele1, ele2) ele1가 lst1 및 ele2 어디에서 순서를 보존 lst2 내지 두리스트를 취하고 반환.

"is"연산은 두 피연산자가 같은 객체이면 true를 반환합니다.

A가 B의 얕은 사본이라고 말하면 실제로 A와 B는 필드와 동일한 개체 집합을 공유 함을 의미합니다. 하드 카피는 필드가 동일한 값을 가지지 만 다른 개체임을 의미합니다.

"동일한 개체"는 매우 혼란 스러울 수 있습니다. 나는 보통 저수준 메모리 주소와 동등하다고 생각한다. 두 개체의 필드가 동일한 메모리 주소를 갖는 경우 서로의 얕은 복사본입니다. 그러나 파이썬은 "is"가 메모리 주소를 비교한다는 보장을하지 않습니다. X 및 Y는 동일한 필드 값을 갖는 다른 물체 경우이 함수에 하드 카피인지 테스트 용

,

def check_hard_copy(lst1, lst2): 
    return lst1 is not lst2 and 
      all([x is not y and x == y for x, y in zip(lst1, lst2)]) 

, 우리는 검사된다. 원하는 경우 ==를 사용자 정의 비교 함수로 바꿉니다.

+0

설명해 주셔서 감사합니다! 정말 고마워요 :) – user2489861

3
def check_shallow_copy(lst1, lst2): 
    if lst1 is lst2 or len(lst1) != len(lst2): 
     return False 
    return all(x is y for x, y in zip(lst1, lst2)) 

정확히 check_deep_copy의 정의가 어렵습니다. 예를 들어, 모든 개체가 불변 인 경우 깊은 복사본 이 얕은 복사본과 똑같이 보일 수 있습니다.

+0

가양 '... 길이 검사가 필요해. –

+0

굉장하고 간단합니다! upvoting. – Tadeck

+0

도움 주셔서 감사합니다! 그러나 클래스에서 나는 아직 zip 함수를 배웠지 않으며 우리는 배운 것들을 구현하기로되어 있습니다. 그래서 위의 코드에서 너무 멀리 벗어나지 않고 for 루프 내부에서 all (id (lst1 [idx]) == id (lst2 [idx]))를 사용하면 그 작업이 가능합니까? 다시 한 번 감사드립니다! – user2489861

1

zip없이 : "F", "O", "O"] '및'[ "F", "O", "O", "X"] '용

def check_shallow_copy(lst1, lst2): 
    if lst1 is lst2 or len(lst1) != len(lst2): 
     return False 
    return all(lst1[i] is lst2[i] for i in range(len(lst1))) 
+0

고마워요! :) – user2489861