# Why array slices can't be passed to a function by reference?

**URL:** <https://discourse.julialang.org/t/why-array-slices-cant-be-passed-to-a-function-by-reference/9792>\
**Category:** General Usage\
**Tags:** question\
**Created:** [March 18, 2018, 5:48pm UTC](https://discourse.julialang.org/t/why-array-slices-cant-be-passed-to-a-function-by-reference/9792 "2018-03-18T17:48:51Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![vpetukhov](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vpetukhov/32/12954_2.png) [@vpetukhov](https://discourse.julialang.org/u/vpetukhov)\
**Post date:** [March 18, 2018, 5:48pm UTC](https://discourse.julialang.org/t/why-array-slices-cant-be-passed-to-a-function-by-reference/9792/1 "2018-03-18T17:48:51Z")

</div>

Imagine we have an array and we want to change it inside a function:

```julia
function set_ones!(x)
    x[:,:] .= 1
end

arr = zeros(5)
set_ones!(arr)
println(arr)

```

It works just as expected. Result:

```julia
[1.0, 1.0, 1.0, 1.0, 1.0]

```

But if we want change only part of the array:

```julia
arr2 = zeros(5)
set_ones!(arr2[1:3])
println(arr2)

```

Result:

```julia
[0.0, 0.0, 0.0, 0.0, 0.0]

```

Is it how it supposed to work, or is it a bug?

---

<div class="post-metadata">

**Author:** ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)\
**Post date:** [March 18, 2018, 6:05pm UTC](https://discourse.julialang.org/t/why-array-slices-cant-be-passed-to-a-function-by-reference/9792/2 "2018-03-18T18:05:42Z")

</div>

Slicing produces copies. Pass a `view`.

---

<div class="post-metadata">

**Author:** ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)\
**Post date:** [March 18, 2018, 6:19pm UTC](https://discourse.julialang.org/t/why-array-slices-cant-be-passed-to-a-function-by-reference/9792/3 "2018-03-18T18:19:49Z")

</div>

> [@kristoffer.carlsson](#):
>
> Slicing produces copies. Pass a view.

See also: [https://docs.julialang.org/en/stable/manual/performance-tips/#Consider-using-views-for-slices-1](https://docs.julialang.org/en/stable/manual/performance-tips/#Consider-using-views-for-slices-1)

---

<div class="post-metadata">

**Author:** ![aaowens](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/aaowens/32/12101_2.png) [@aaowens](https://discourse.julialang.org/u/aaowens)\
**Post date:** [March 18, 2018, 6:20pm UTC](https://discourse.julialang.org/t/why-array-slices-cant-be-passed-to-a-function-by-reference/9792/4 "2018-03-18T18:20:53Z")

</div>

There is a convenient macro for this which works here

```julia
julia> @views set_ones!(arr2[1:3])
3×1 SubArray{Float64,2,Base.ReshapedArray{Float64,2,SubArray{Float64,1,Array{Float64,1},Tuple{UnitRange{Int64}},true},Tuple{}},Tuple{Base.Slice{Base.OneTo{Int64}},Base.Slice{Base.OneTo{Int64}}},true}:
 1.0
 1.0
 1.0

julia> println(arr2)
[1.0, 1.0, 1.0, 0.0, 0.0]

```

---

<div class="post-metadata">

**Author:** ![vpetukhov](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/vpetukhov/32/12954_2.png) [@vpetukhov](https://discourse.julialang.org/u/vpetukhov)\
**Post date:** [March 18, 2018, 6:53pm UTC](https://discourse.julialang.org/t/why-array-slices-cant-be-passed-to-a-function-by-reference/9792/5 "2018-03-18T18:53:46Z")

</div>

Wow, thank you a lot!
