Python’s built-in vars()
function returns the __dict__
attribute of an object—a dictionary containing the object’s changeable attributes. Without argument, it returns the local symbol table similar to locals()
.
class Car: def __init__(self): self.speed = 100 self.brand = 'porsche' porsche = Car() print(vars(porsche)) # {'speed': 100, 'brand': 'porsche'}
Python’s built-in vars()
function returns a dictionary of name: value
mappings of all the names defined in the local scope or the scope of the optional object
argument, and their associated values.
- When used without an argument,
vars()
returns the same aslocals()
that returns a dictionary ofname --> object
mappings of names defined in the current local scope and objects being their associated values. - When used with an object argument,
vars(object)
returns the same asobject.__dict__()
that returns a dictionary ofname --> object
mappings of writable names defined in the object’s scope and objects being their associated values.

Learn by example! Here’s an example on how to use the vars()
built-in function.
Table of Contents
Video vars()
vars() without Argument: Syntax and Example
Syntax: vars() # Returns dictionary of "name --> value" mappings like locals()
Arguments | - | – |
Return Value | dict | Dictionary of mappings from variable names defined in the local namespace and the objects they’re referring to. |
When used without an argument, vars()
returns the same as locals()
that returns a dictionary of name --> object
mappings of names defined in the current local scope and objects being their associated values.
>>> vars() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:\\Users\\...\\code.py', 'find_path': <function find_path at 0x0000019B33898730>, 'G': [[1, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 1, 1, 1, 0], [1, 0, 0, 1, 1]]} >>> locals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:\\Users\\...\\code.py', 'find_path': <function find_path at 0x0000019B33898730>, 'G': [[1, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 1, 1, 1, 0], [1, 0, 0, 1, 1]]} >>> vars() == locals() True
vars() with Argument: Syntax and Example
Syntax: vars(object) # Returns same as object.__dict__()
Arguments | object | Object for which the attribute name-object mappings should be retrieved |
Return Value | dict | Dictionary of mappings from attribute names defined in the object’s namespace and the objects they’re referring to. |
When used with an object argument, vars(object)
returns the same as object.__dict__()
that returns a dictionary of name --> object
mappings of writable names defined in the object’s scope and objects being their associated values.
>>> def f(): x = 2 >>> vars(f) {} >>> f.y = 42 >>> vars(f) {'y': 42}
As soon as you assign a new attribute y
to the function object, it becomes available in the dictionary returned by the vars()
function. However, the local variable x
is not an attribute of f
, so it is not part of the returned dictionary.
[How to Fix] TypeError: vars() argument must have __dict__ attribute
If you pass an argument into the vars()
function that doesn’t have a __dict__()
function, Python raises a TypeError
. This means that the object in question doesn’t have any attributes such as an integer, float, list, etc.
>>> vars(42) Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> vars(42) TypeError: vars() argument must have __dict__ attribute
You can fix it by only passing arguments that have overwritten the __dict__
method such as a function or a custom object:
>>> def f(): return 42 >>> vars(f) {} >>> f.val = 'YES' >>> vars(f) {'val': 'YES'}
Summary
Python’s built-in vars()
function returns a dictionary of name: value
mappings of all the names defined in the local scope or the scope of the optional object
argument, and their associated values.
When used without an argument, vars()
returns the same as locals()
that returns a dictionary of name --> object
mappings of names defined in the current local scope and objects being their associated values.
>>> vars() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:\\Users\\...\\code.py', 'find_path': <function find_path at 0x0000019B33898730>, 'G': [[1, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 1, 1, 1, 0], [1, 0, 0, 1, 1]]} >>> locals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'C:\\Users\\...\\code.py', 'find_path': <function find_path at 0x0000019B33898730>, 'G': [[1, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 1, 1, 1, 0], [1, 0, 0, 1, 1]]} >>> vars() == locals() True
When used with an object argument, vars(object)
returns the same as object.__dict__()
that returns a dictionary of name --> object
mappings of writable names defined in the object’s scope and objects being their associated values.
>>> def f(): x = 2 >>> vars(f) {} >>> f.y = 42 >>> vars(f) {'y': 42}
I hope you enjoyed the article! To improve your Python education, you may want to join the popular free Finxter Email Academy:
Do you want to boost your Python skills in a fun and easy-to-consume way? Consider the following resources and become a master coder!
Where to Go From Here?
Enough theory, let’s get some practice!
To become successful in coding, you need to get out there and solve real problems for real people. That’s how you can become a six-figure earner easily. And that’s how you polish the skills you really need in practice. After all, what’s the use of learning theory that nobody ever needs?
Practice projects is how you sharpen your saw in coding!
Do you want to become a code master by focusing on practical code projects that actually earn you money and solve problems for people?
Then become a Python freelance developer! It’s the best way of approaching the task of improving your Python skills—even if you are a complete beginner.
Join my free webinar “How to Build Your High-Income Skill Python” and watch how I grew my coding business online and how you can, too—from the comfort of your own home.
While working as a researcher in distributed systems, Dr. Christian Mayer found his love for teaching computer science students.
To help students reach higher levels of Python success, he founded the programming education website Finxter.com. He’s author of the popular programming book Python One-Liners (NoStarch 2020), coauthor of the Coffee Break Python series of self-published books, computer science enthusiast, freelancer, and owner of one of the top 10 largest Python blogs worldwide.
His passions are writing, reading, and coding. But his greatest passion is to serve aspiring coders through Finxter and help them to boost their skills. You can join his free email academy here.