변수를 리스트에 넣었는데 원래 변수와 리스트로 들어간 변수의 값이 연동이 안됩니다

조회수 53회
a = "에이"
b = "비"
c = "씨"
d = "디"

abcd = [a, b, c, d]

d의 값을 바꿔도 abcd 변수의 d 값이 안바뀌는데 왜 그런거죠? 반대의 경우도 똑같은거 같아요

dabcd[3]이 왜 따로 노는지 이해가 안갑니다. 두 변수의 이름이 같은데 다를 수가 있나요? 왜 서로 연동이 안되지 알려주시면 감사하겠습니다.

그리고 지금은 코딩도장 보고 공부하는데 더 좋은 사이트나 책 있나요? 코딩도장에는 이거에 대한 얘기는 없는거 같아요. 제가 발견을 못하는건지.

2 답변

  • 좋아요

    2

    싫어요
    채택 취소하기

    두 가지 이유때문에 말하신 '연동'을 할 수 없습니다.

    첫째는 할당을 리터럴 상수로 하셨기 때문이고, 둘째는 d 값을 바꾸신게 아니라 d 변수에 다른 값을 할당하신 것이기 때문입니다.

    a = "에이"
    b = "비"
    c = "씨"
    d = "디"
    
    #abcd = [a, b, c, d]
    abcd = ["에이", "비", "씨", "디"]
    

    작성하신 이 코드는 위와 동일합니다. d값을 바꾸셨다고 하신 건 d 변수에 다른 값을 할당한 것이지 d의 값(객체) 자체의 값을 바꾼 것이 아닙니다.

    아래는 참고용 예시입니다.

    a = "에이"
    b = "비"
    c = "씨"
    d = ["디"]
    
    abcd = [a, b, c, d] #d는 리스트 객체를 전달받았습니다.
    #abcd = ["에이", "비", "씨", ["디"]] 이와 같으나 ["디"]는 d와 연결되어 있습니다.
    print(abcd)
    c = "씨씨" 
    #위 경우 c 변수에 "씨씨"를 할당한 것이지 "씨"를 "씨씨"로 바꾼게 아닙니다.
    print(abcd) #따라서 변동이 없습니다.
    d[0] = "디디"
    #위 경우 d 변수가 가진 ["디"]객체의 0위치에 있는 "디"를 "디디"로 바꿨습니다.(할당하였습니다.) 따라서 ["디"] 객체 채로 가지고 있던 다른 변수(리스트)도 영향을 받게 됩니다.
    print(abcd) #객체가 반영이 되어 변경된 값인 '디디'로 표시됩니다.
    

    [결과]

    ['에이', '비', '씨', ['디']]
    ['에이', '비', '씨', ['디']]
    ['에이', '비', '씨', ['디디']]
    

    변수가 무엇을 참조하고 있는가에 대해 생각해보시기 바랍니다.

    감사합니다.

    • 친절한 설명 감사합니다! 김지용 2020.9.12 10:46
  • >>> a='a'
    >>> b='b'
    >>> c='c'
    >>> d='d'
    >>> e=[a,b,c,d]
    >>> id(a)   #2001198307120
    >>> id(b)   #2001198295536
    >>> id(c)   #2001197278640
    >>> id(d)   #2001197283632
    >>> id(e)   #2001199954952
    >>> id(e[3])   #2001197283632 (d) 이외 다른것도 b,c,d를 가리킴
    >>> d=['d']
    >>> id(d)   #2001198591240
    >>> id(e[3])   #2001197283632 일전의 d 를 갖고있음. 
    >>> e=[a,b,c,d]  #재지정
    >>> id(a)   #2001198307120
    >>> id(b)   #2001198295536
    >>> id(c)   #2001197278640
    >>> id(d)   #2001198591240(변경됨)
    >>> id(d[0])    #2001197283632
    >>> d[0]='b' 
    >>> id(d)   #2001198591240(동일함)
    >>> id(d[0])    #2001198295536(변경됨)
    
    • 설명 감사드립니다! id() 자주 활용하겠습니다 김지용 2020.9.12 10:47

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.