[해결] 파이썬 리스트 복사하기

GunSmoke의 이미지

이번에도 점프투파이썬에 대한 문의입니다.

http://wikidocs.net/mybook/read/page?pageid=40

다음 코드를 살펴보니 변수 선언만 없을 뿐 완전히 포인터로 사용하는 것 같네요.
그런데 왜 이 코드에서는 b의 값이 a와 함께 변하는데...

>>> a = [1,2,3] 
>>> b = a 
>>> a[1] = 4 
>>> a 
[1, 4, 3] 
>>> b 
[1, 4, 3]

이렇게 a[:], 즉 리스트 a의 첫번째 요소부터 마지막 요소까지 지정하면 변하지 않는 것인가요? 'b=a'와 'b=a[:]'의 차이를 이해할 수가 없어요. 한 말씀 부탁드립니다.

>>> a = [1, 2, 3] 
>>> b = a[:] 
>>> a[1] = 4 
>>> a 
[1, 4, 3] 
>>> b 
[1, 2, 3]
winner의 이미지

a와 b는 동일한(identical) list가 아니기 때문에 같이 변하지 않는 것이죠.

ktd2004의 이미지

저도 요즘 파이썬을 공부하고 있습니다. ^^;

파이썬에서 변수명은 실제 변수(?)를 가리키고 있는 이름(레퍼런스)일 뿐입니다.

그래서 다음과 같은 코드는 "[1,2,3]"이 있고, a와 b는 단지 "[1,2,3]"을 가리키고 있을 뿐입니다.

>>> a = [1,2,3]
>>> b = a
>>> a[1] = 4

따라서 "[1,2,3]"이 변경되면, a와 b는 모두 변경된 "[4,2,3]"을 가리키고 있을 뿐이죠.

그런데 슬라이싱([:])의 경우에는 새로운 변수(?)가 생성되게 됩니다.

>>> a = [1,2,3]
>>> b = a[:]

이 경우에는 같은 값(1,2,3)을 가진 두개의 리스트("[1,2,3]")이 존재하게 됩니다.
각각의 리스트를 a와 b가 가리키고 있습니다.

따라서 a를 수정해도 b는 변경되지 않는 것입니다.

저도 이제 파이썬을 배우고 있어서,
용어나 설명이 매끄럽지 못한 부분이 많은 것 같습니다.
잘못된 용어나 내용은 지적해 주시면 감사하겠습니다.

승원의 이미지

b = a를 하면, b는 a가 가리키는 [1,2,3]이라는 리스트를 가리키게 됩니다.
즉, a와 b는 동일한 리스트를 참조합니다.
따라서, 한 쪽을 바꾸면 다른 한 쪽도 바뀝니다.

하지만, b = a[:]를 하면, a가 가리키는 [1,2,3]이라는 리스트가 b로 "복사"됩니다.
즉, a와 b는 내용은 같지만, 서로 다른 리스트를 참조합니다.
(a가 가리키는 리스트가 원본이라면, b가 가리키는 리스트는 a의 복사본이라고 할 수 있습니다.)
Python의 슬라이스 연산은 원본 리스트를 복사한 새로운 리스트를 생성하여 반환하기 때문이죠.

GunSmoke의 이미지

C의 'call by value'가 머리에 깊이 박혀 있어서 선뜻 이해가 어려웠네요.
슬라이스 연산은 사본 리스트를 생성해서 반환한다는 정보 감사드립니다.

大逆戰

大逆戰

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.