Mojo 变量与基本类型
本篇覆盖:var 声明、类型标注、数值/字符串/布尔类型、List 与 Dict、模板字符串。依然基于 Mojo 1.0 语法。
一、var:变量必须显式声明
和 Python 最大的区别之一——Mojo 变量必须用 var 关键字声明:
mojo
def main():
var x = 10 # 类型自动推断为 Int
var y = x * x
print(y) # 100可以显式标注类型,也支持先声明后赋值:
mojo
def main():
var x: Int = 10 # 显式类型
var sum: Int # 先声明
sum = x + 5 # 后赋值
print(sum) # 15⚠️ 旧教程里的
let(不可变变量声明)已在 1.0 前被移除。声明一律用var;需要「不可变」语义时,用var+ 不修改它的纪律,或使用编译期参数(见第七篇)。
变量遵循值语义:赋值产生拷贝,修改新变量不影响旧变量(对栈上的小类型零成本)。
二、数值类型:比 Python 更「系统级」
Python 的 int 是任意精度大整数,Mojo 则是定宽机器类型:
| 类型 | 说明 |
|---|---|
Int | 默认有符号整数(64 位平台上是 Int64),字面量 42 的类型 |
UInt | 无符号整数 |
Int8/16/32/64、UInt8/16/32/64 | 定宽整数 |
Float64 | 双精度浮点,字面量 3.14 的默认类型 |
Float32 | 单精度浮点(GPU 常用) |
Float16、BFloat16 | 半精度(AI 推理常用) |
Bool | 布尔 |
mojo
def main():
var a: Int = 42
var b: Float64 = 3.14
var c: Float32 = 2.5
var flag: Bool = True
# 显式类型转换用构造语法,不做隐式窄转换
var d = Float64(a) + b
print(a, b, c, flag, d)注意两点:
- 没有隐式类型转换——
Int和Float64混合运算需要显式转换,这是编译期强制的 - 数字里可以用下划线增加可读性:
1_000_000
三、字符串
mojo
def main():
var s = "Hello"
var t = s + ", Mojo" # 拼接
print(len(t)) # 11
print(t[0]) # H模板字符串 t"..."
1.0 的新特性,花括号直接插值,编译期处理、无中间分配,是格式化输出的首选:
mojo
def main():
var name = "Mojo"
var year = 2026
print(t"你好, {name}! 当前 {year} 年, 明年是 {year + 1}")对比 Python 的 f-string 几乎无感切换。
四、集合:List 与 Dict
mojo
def main():
# List:类型在方括号里指定
var temps: List[Float64] = [20.5, 22.3, 19.8, 25.1]
temps.append(19.5)
print(len(temps)) # 5
print(temps[0]) # 20.5
# 遍历
for temp in temps:
print(temp)
# 带索引遍历
for i in range(len(temps)):
print(t"第 {i + 1} 个: {temps[i]}")
# Dict
var scores: Dict[String, Int] = Dict[String, Int]()
scores["alice"] = 95
scores["bob"] = 87
print(scores["alice"]) # 95细节:
List[T]、Dict[K, V]是泛型集合,存任意符合 trait 约束的类型Dict的键类型需要可哈希(符合KeyElementtrait)- 集合可以整体用
[]字面量初始化(类型可推断时)
五、元组与解包
mojo
def get_point() -> (Int, Int):
return (3, 4)
def main():
var (x, y) = get_point()
print(x + y) # 7六、类型推断的边界
Mojo 的类型推断能力弱于现代 C++/Rust,多数场景建议:
- 字面量直接赋值:可省略类型(推断为
Int/Float64/String) - 函数参数和返回值:必须写类型
- 空集合初始化:必须写类型(
List[Int]()) - 拿不准时显式标注,报错信息也会更清晰
七、小结
| Python | Mojo 1.0 |
|---|---|
x = 10 | var x = 10 |
let(旧 Mojo) | 已移除,统一 var |
int(任意精度) | Int(定宽机器整型) |
| f-string | t"..." 模板字符串 |
list / dict | List[T] / Dict[K, V] |
| 隐式数字转换 | 显式转换 Float64(x) |
下一篇:函数与错误处理。