px普贤教程PuXian
普贤教程 › 基础教程

变量与类型

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
null

type() 返回的就是这些字符串,可以直接用来做分支判断:

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"的困惑。