Skip to content
当前页大纲

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/64UInt8/16/32/64定宽整数
Float64双精度浮点,字面量 3.14 的默认类型
Float32单精度浮点(GPU 常用)
Float16BFloat16半精度(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)

注意两点:

  1. 没有隐式类型转换——IntFloat64 混合运算需要显式转换,这是编译期强制的
  2. 数字里可以用下划线增加可读性: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 的键类型需要可哈希(符合 KeyElement trait)
  • 集合可以整体用 [] 字面量初始化(类型可推断时)

五、元组与解包

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]()
  • 拿不准时显式标注,报错信息也会更清晰

七、小结

PythonMojo 1.0
x = 10var x = 10
let(旧 Mojo)已移除,统一 var
int(任意精度)Int(定宽机器整型)
f-stringt"..." 模板字符串
list / dictList[T] / Dict[K, V]
隐式数字转换显式转换 Float64(x)

下一篇:函数与错误处理。

MIT License.