# COMP1117复习：第一弹

----
整理了一些易错点，发到博客上帮大家查缺补漏。
----
考虑以下Python代码。如果`add_item()`函数被调用两次，第二次调用会打印什么？ 

```python
def add_item(item,basket=[]):
    basket.append(item)
    print(basket)
   
add_item('apple')
add_item('banana')
```

答案是`[apple,banana]`

注意到Lecture 5中提到

> **Default arguments are evaluated at definition time, not function run time.**

同类型还有一道题

```python
nums = [1, 2, 3]
for i in range(len(nums)):
nums.append(i)
print(i, end=" ")
```

输出是？

不是无限循环！

是0 1 2啦，因为len(nums)只算一次

--------

```python
def update_list(data):
    data.append(4)
    data = [1,2]
    
my_list = [8,9]
update_list(my_list)
print(my_list)
```

没搞懂的可以在`pythontutor.com`上跑一遍代码。

应该输出`[8,9,4]`而不是`[1,2]`

append(4)直接修改了原列表，而`data = [1,2]`是在函数内的局部变量赋值。

----------

```python
matrix = [[0]] * 3
matrix[0][0] = 5
print(matrix)
```

是[[5],[5],[5]]，而非[[0],[0],[0]]

`*` 操作符复制的是**引用**（地址）而不是对象本身

-------

A._1_2_3

B.1_2_3_

C.A_1.com

哪个是valid的？

答案：A

在课程里提到了两次valid的问题

* 文件名
* 变量名

对于前者，结尾是.py就可以

对于后者有两项要求：

* 变量名必须以字母或者下划线开头，**数字**不行
* 变量名只能包含字母、数字和下划线，`.`,`-`都不行。

------

一个冷知识，return多个值的时候，其实return的是元组。

