# 2.3.3 表达式

本节目标：

* 理解表达式，掌握表达式求值的方法

我们创建一个小海龟对象

```python
t1 = turtle.Turtle()
```

这个小海龟对象（可以理解为它的属性）被存在了内存中，通过`id(t1)`我们可以看到这个对象的唯一身份标识，这个对象被储存在内存的`id(t1)`这个位置（严格来讲，只有CPython是这样）。 而`t1`则是这个对象的一个代号，当我们再写`t1`的时候，Python就会知道，`t1`是之前创建的小海龟对象。

如果我们忘记加括号

```python
t1 = turtle.Turtle
```

那么就是把`turtle.Turtle`这个类赋值给了`t1`，当我们再写`t1`的时候，得到的是`turtle.Turtle`这个类。 即`t2 = turtle.Turtle()`和`t2 = t1()`变成一个意思了。

这体现了Python中“一切皆对象”的理念，大家都是平等的。

但之前提到关键字不是对象，所以，妄想

```python
t1 = import # 不行
t1 turtle # 不行不行不行
```

是不行的。因为`import`不是对象。

反过来，

```python
turtle.Turtle = 42
```

是合乎Python语法的。 但这样做之后，

```python
t1 = turtle.Turtle()
```

就相当于

```python
t1 = 42()
```

这是错误的。

能求得结果的就是表达式，比如表达式`42`的结果是`42`，`1+1*1/1`的结果是`2.0`，`[i ** 2 for i in range(10)]`的结果是一个`list`，这个`list`里面包含10个`int`类型的对象。

我们可以写

```python
t1.fd(42)
```

前进`42`步。

也可以写

```python
t1.fd(21 * 2)
```

这时，Python会先计算出`21 * 2`的结果。

更复杂（~~无聊~~）一点，

```python
f1.fd(range(100)[42])
```

也是一样的。
