리스트 복사

>>> a = 3
>>> b = 3
>>> a = 1
>>> a
1
>>> b
3

3이라는 객체를 a, b 두 개의 변수가 가리키고 있다가 a가 다른 객체 1을 가리키게 됩니다. 그러나 배열은 이런 방법과는 다르게 동작합니다.

1. 일단 배열은 []를 사용할 때 마다 매번 객체를 생성합니다.

>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> a is b
False

2. 다음과 같은 방법으로 같은 배열을 가리키도록 할 수 있습니다.

>>> b = a
>>> a is b
True

하지만 이 때 만약에 a변수를 통해서 배열의 값을 바꾸게 되면 b도 역시 같은 배열 객체를 참조하기 때문에 값이 바뀐 배열을 참조하게 됩니다.

>>> a[0] = 100
>>> b
[100, 2, 3]

단순히 1번과 같은 효과를 가지면서 배열에 있는 모든 값들을 동일하게 가지는 다른 배열을 만드는 방법은 두 가지가 있습니다.

1. [:] 이것을 사용하는 방법과

>>> c = a[:]
>>> a is c
False
>>> c
[100, 2, 3]

2. copy 모듈을 사용하는 방법이 있습니다.

>>> from copy import copy
>>> d = copy(A)
Traceback (most recent call last):
  File “<stdin>”, line 1, in <module>
NameError: name ‘A’ is not defined
>>> d = copy(a)
>>> d
[100, 2, 3]
>>> d is a
False

모듈이라는 것이 나왔는데…. 뭔지 모르겠군요. from copy import copy… copy로 부터 copy를 불러 들인것인가.. 흠.. from 패키지 import 클래스 인가.. 아니면 from 클래스 import 메소드 인가..;;

빈 공간에 예민함

>>> if ”:
…     print “True”
… else:
…     print “False”

False

이렇게 들여쓰기를 해주면 잘 동작합니다. 하지만 조금 귀찮아서 들여쓰기를 안해주면 아래처럼 에러가 발생합니다.

>>> if ”:
… print “True”
  File “<stdin>”, line 2
    print “True”
        ^
IndentationError: expected an indented block

블럭 구분을 괄호로 하지 않고 들여쓰기로 하는 것 같습니다. ()이거는 터플, [] 이거는 배열, {} 이거는 딕셔너리로 사용하기 때문에 블럭을 구분하려면 들여쓰기를 잘해야 겠네요.

{}; 이런거에 눈이 익숙해져 있는데 블럭이 없는 코드에 눈이 익숙해져야겠습니다.

변수

전부 객체인가 봅니다. 놀라운 건.. 전부 Java에서 “문자열” 이런 식으로 문자열을 지정할 때 와 똑같이 동작한다는 겁니다.

String name = “keesun”;
name2 = “keesun”;

이렇게 했을 때 name과 name2가 같은 객체를 가리키듯이 python에서도 그렇네요. 단 문자열만 그런게 아니라 전부 다 그런가 봅니다.

>>> a = “abc”
>>> b = “abc”
>>> a is b
True
>>> a = 3
>>> b = 3
>>> a is b
True
>>> b = 2
>>> a
3>>> b
>>> b
2

오호 신기한 거 발견!! 두 변수에 들어있는 값 바꾸는 것이 매우 편하네요.

>>> a = 1
>>> b = 2
>>> a, b = b, a
>>> a
2
>>> b
1

변수명의 첫글자는 반드시 영문자 or 언더바(_) 여야 하고 숫자, 영문자, 언더바만 사용할 수 있습니다.

예약어는 다음과 같습니다.

and     assert     break     class     continue
def      del      elif     else     except
exec     finally     for     from     global
if     import    in     is     lambda
not     or     pass     print    raise
return     try    while

객체를 가리키는 변수들이 없으면 메모리에서 제거 된다고 합니다. 흠.. 바로 사라지나??

True, False

boolean 타입이 없나 봅니다.

초간단하게 정리하면 뭐가 들어있으면 True 아무것도 없으면 False 입니다. true나 false는 예약어가 아니기 때문에 변수명으로 사용할 수도 있네요.

” ” – 거짓
‘ ‘ – 거짓
() – 거짓
[] – 거짓
{} – 거짓
숫자 0 – 거짓

배열이나 문자열에 뭐라도 들어있거나 0이 아닌 숫자는 모두 참입니다.

>>> if ”:
…     print “t”
… else:
…     print “f”
…     print “a”
…     print “l”
…     print “s”
…     print “e”

f
a
l
s
e
>>>

Dictionary(Map)

Map 처럼 key, value 쌍으로 이루어진 것을 딕셔너리라고 부르는군요.

만드는 방법 : 변수명 = {Key1:Value1, Key2:Value2, Key3:Value3,,,,}
key로 value가져오기 : 변수명[‘key’]
key, value 추가하기 : 변수명[‘추가 할 key’] = 추가할 value
key, value 삭제하기 : del 변수명[‘제거 할 쌍의 key’]

>>> dic = {‘name’:’keesun’, ‘age’:26, ’email’:’keesun@email.com’}
>>> dic
{‘age’: 26, ‘name’: ‘keesun’, ’email’: ‘keesun@email.com’}
>>> print dic
{‘age’: 26, ‘name’: ‘keesun’, ’email’: ‘keesun@email.com’}
>>> dic[‘name’]
‘keesun’
>>> dic[‘age’]
26
>>> dic[‘age’] + 1
27
>>> dic[‘name’] + 1
Traceback (most recent call last):
  File “<stdin>”, line 1, in <module>
TypeError: cannot concatenate ‘str’ and ‘int’ objects
>>> dic
{‘age’: 26, ‘name’: ‘keesun’, ’email’: ‘keesun@email.com’}
>>> dic[‘city’] = ‘seoul’
>>> dic
{‘city’: ‘seoul’, ‘age’: 26, ‘name’: ‘keesun’, ’email’: ‘keesun@email.com’}
>>> del[‘name’]
  File “<stdin>”, line 1
SyntaxError: can’t delete literal
>>> del dic[‘name’]
>>> dic
{‘city’: ‘seoul’, ‘age’: 26, ’email’: ‘keesun@email.com’}

주의할 것은 절대로 중복되는 key를 사용하지 말 것. 만약에 중복되는 키를 사용하면 중복된 키를 가진 쌍들 중에 하나를 남기고 나머진 사라지는데 어떤 것이 사라질지 예측 불가능입니다.

key값은 immutable해야 합니다. 따라서 list를 쓸 수 없습니다.

>>> dic[[1,2,3]] = ‘number’
Traceback (most recent call last):
  File “<stdin>”, line 1, in <module>
TypeError: list objects are unhashable
>>> dic[(1,2,3)] = ‘number’
>>> dic
{‘city’: ‘daejun’, ‘age’: 26, (1, 2, 3): ‘number’, ’email’: ‘keesun@email.com’}

value는 mutable하기 때문에 수정이 가능합니다.

>>> dic
{‘city’: ‘seoul’, ‘age’: 26, ’email’: ‘keesun@email.com’}
>>> dic[‘city’] = ‘daejun’
>>> dic
{‘city’: ‘daejun’, ‘age’: 26, ’email’: ‘keesun@email.com’}

keys(), values(), items() 모두 리턴타입이 list 입니다.

이밖에 여러 메소드들은 이곳 제일 아래에서 참조 할 수 있습니다.