普贤教程 › 基础教程
变量与类型
PuXian 是动态类型语言:变量不需要声明类型,值本身带类型。类型错了不会在"声明处"报错,而是在"用错的那一行"报错,并给出行列号。
两种声明
px
var count = 0 # 会重新赋值的变量用 var let pi = 3.14159 # 不打算改的常量式变量用 let
var 与 let 在运行时行为一致——let 声明的变量技术上也能再赋值,语言不强制。它的价值是给读代码的人一个信号:「这个名字后面不会再变」。
七种基本形态
px
var a = 42 # int var b = 3.14 # float var c = "普贤" # string var d = true # bool var e = [1, 2, 3] # list var f = {"k": "v"} # dict var g = null # null print(type(a)) print(type(b)) print(type(c)) print(type(d)) print(type(e)) print(type(f)) print(type(g))
text
int
float
string
bool
list
dict
nulltype() 返回的就是这些字符串,可以直接用来做分支判断:
px
def describe(v): var t = type(v) if t == "list": return "列表,共 " + str(len(v)) + " 项" if t == "dict": return "字典,共 " + str(len(v.keys())) + " 个键" return t + ":" + str(v) print(describe([1, 2])) print(describe({"a": 1})) print(describe(9))
text
列表,共 2 项 字典,共 1 个键 int:9
整数是 64 位
px
print(str(2 ** 62)) print(str(2 ** 64))
text
4611686018427387904 0
溢出不会报错超出 64 位有符号范围时按位回绕,
2 ** 64 得到 0,程序继续跑。涉及金额、ID、哈希时确认数值范围;需要任意精度用生态包 big。除法永远返回浮点
px
print(str(7 / 2)) print(str(7 // 2)) print(str(7 % 2))
text
3.5 3 1
要整数结果用 //。这条规则和 Python 3 一致,从 Python 过来的人不会踩坑;从 Go / C 过来的人要留意:/ 不会给你整数。
null 的判定
px
def name_of(user): var n = user["name"] if n == null: return "(未填)" return n print(name_of({"name": "晨曦"})) print(name_of({"name": null}))
text
晨曦 (未填)
缺键 ≠ null字典里没有这个键时读它,是运行时错误(R1008),不是返回 null。判断键存在要用
d.has("k"),见 字典 一章。值语义与引用语义
| 类型 | 赋值时 | 说明 |
|---|---|---|
| int / float / string / bool / null | 复制值 | 改一个不影响另一个 |
| list / dict | 共享引用 | 两个名字指向同一份数据 |
| bytes | 不可变 | 任何"修改"都返回新对象 |
px
var a = [1, 2] var b = a b.append(3) print(str(a))
text
[1, 2, 3]
需要独立的副本时显式拷贝:
px
var a = [1, 2] var b = [] for x in a: b.append(x) b.append(3) print(str(a)) print(str(b))
text
[1, 2] [1, 2, 3]
没有 clone()列表的浅拷贝可以直接切片
a[0:len(a)](等价于上面那个循环);字典要逐键复制 for k in d: e[k] = d[k],dict(d) 只造空字典、不做拷贝,d.copy() 也不存在。这些都是浅拷贝:内层还是共享的。px
var a = [1, 2] var b = a[0:len(a)] b.append(3) print(str(a)) # [1, 2] print(str(b)) # [1, 2, 3]
text
[1, 2] [1, 2, 3]
类型不匹配的典型报错
px
print("x" + 1)
text
运行时错误: 错误 [R1002] 1:11: 无法相加: string + int
字符串拼接要求两边都是字符串,数字先 str()。这条比 Python 严格,也比 Python 少一半"为什么输出变成了 xx1"的困惑。